Символьный массив и символ завершения строки в C - PullRequest
0 голосов
/ 03 декабря 2018

Я знаю, что в C, \0 завершает строку.Мы можем назначить как строки, так и массив символов для массива символов?

char c1[] = "hello";
char c2[] = {'h','e','l','l','o'};

Однако я понимаю, что массив символов не имеет \0 в качестве завершающего символа:

printf("%d\n",sizeof(c1));  //6
printf("%d\n",sizeof(c2));  //5

Однако когдаЯ печатаю их и вижу что-то вроде этого:

printf("%s\n",c1); //hello
printf("%s\n",c2); //helloV

Q1.Если я перезапущу его, во второй строке иногда выводится helloU, иногда - helloV.Почему это так?

Q2.Также, как это нормально, что массив символов может содержать \0 завершающую строку, а не \0 завершающий массив символов?

Q3.Я знаю, что printf завершается, когда встречается \0.Как ведет себя printf, когда не встречается \0?

Код

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

printf прекращает чтение памяти при обнаружении \0.В вашем примере с c2 вы не знаете, когда printf остановит чтение, потому что вы не знаете, где находится следующий \0 в памяти.printf действительно читает случайную память, что объясняет, почему вы не можете предсказать, что будет напечатано на экране.В конце концов, вы можете начать читать память, которая не принадлежит вашей программе.Если это произойдет, большинство операционных систем немедленно прекратит работу вашей программы.

Подумайте об этом простом примере:

int a;
printf("%d", a);

Вы не можете предсказать, что будет содержать a, и поэтому не можетепредсказать, что будет напечатано на экранах.То же самое происходит в вашем примере, вы не знаете, что следует за 'o' во втором массиве.

0 голосов
/ 03 декабря 2018
  1. c2 не является строкой, поэтому передача ее в printf %s имеет неопределенное поведение.Неопределенное поведение не определено.Технически не требуется ничего печатать.Он также может удалить все ваши файлы или зайти в бесконечный цикл или ...
  2. Не все массивы символов являются строками.До тех пор, пока вы не передадите его функциям, ожидающим строку, вы можете хранить в массиве символов все, что захотите.
  3. У него неопределенное поведение.
...