#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
, и поэтому чтения из функций, ожидающих строки, проскользнули туда.