содержимое массива дублируется в C?

#arrays #c #string

#массивы #c #строка

Вопрос:

Я написал простую программу, чтобы проверить, влияет ли метод объявления строки на то, добавлен ли по умолчанию ограничитель строки или нет, однако я заметил, что содержимое одного массива копируется в другой. Почему это происходит?

 #include<stdio.h>
#include<string.h>

int main() {
    char *Name1 = "Name1";
    char Name2[] = "Name2";
    char Name3[] = {'N','a','m','e','3'};
    printf("Name1 = %lun",strlen(Name1));
    printf("%sn",Name1);
    printf("Name2 = %lun",strlen(Name2));
    printf("%sn",Name2);
    printf("Name3 = %lun",strlen(Name3));
    printf("%sn",Name3);
    return 0;
}
# Name1 outputs 5 -> Name1
# Name2 outputs 5 -> Name2
# Name3 outputs 10 -> Name3Name2
  

Комментарии:

1. Name3 не завершается нулем, поэтому strlen не работает. printf также ожидает строку, завершающуюся нулем с %s .

2. Вы сами отвечаете на свой вопрос. У Name3 нет 0 в конце. Однако поведение, которое вы получили, было не тем, что вы ожидали в этом случае.

Ответ №1:

Вы вызвали неопределенное поведение с помощью:

  • Передача данных с неправильным типом в printf() : strlen() возвращает size_t и правильный спецификатор формата для печати, который есть %zu .
  • Переданная последовательность символов, которая не завершается нулем ( Name3 ), в функции, которые ожидают строки (последовательность символов, заканчивающаяся нулевым символом).

Похоже, что Name2 произошло, что оно было выделено рядом с Name3 , и поэтому чтения из функций, ожидающих строки, проскользнули туда.