У инициализированных таким образом массивов символов автоматически добавляются нулевые терминаторы? - PullRequest
0 голосов
/ 19 сентября 2018

Массив char инициализируется следующим образом:

char foo[] = {0x31, 0x32, 0x33}; //123

добавляет к концу нулевой терминатор, чтобы данные памяти в foo выглядели примерно как 0x31323300?Или это просто записать 0x313233 в память?Кроме того, foo обрабатывается компилятором как строковый литерал независимо от этого метода инициализации?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Нет, если вы не укажете размер массива и не используете строковый литерал в качестве инициализатора, размер и содержимое массива будут точно соответствовать вашим инициализаторам.

ВВ вашем случае массив foo будет состоять ровно из трех char элементов, содержащих (по порядку) 0x31, 0x32 и 0x33.

Если вы используете строковый литерал в качестве инициализатора, тогдамассив будет включать терминатор.И если вы укажете размер, превышающий количество инициализаторов (например, char foo[4] в вашем примере с тремя инициализаторами), то остальные элементы будут инициализироваться нулями (что равно символу конца строки).

Также обратите внимание, что даже если вы используете строковый литерал в качестве инициализатора, но указали размер меньший , чем инициализатор, массив также не будет завершен.

0 голосов
/ 19 сентября 2018

Есть ли инициализация массива char следующим образом:

`char foo [] = {0x31, 0x32, 0x33};// 123 получить нулевой терминатор, добавленный в его конец?

Нет, это будет просто массив символов.

Также foo обрабатывается как строкалитерал компилятором независимо от этого метода инициализации?

Нет, foo не обрабатывается как строковый литерал.Смотри здесь .

0 голосов
/ 19 сентября 2018

foo - это просто старый char массив с тремя элементами, без нулевого терминатора.Единственное место, где компилятор «волшебным образом» добавил бы нулевой терминатор, это когда вы используете строковый литерал, то есть строку, обозначенную двойными кавычками ("):

char* string = "I have a null terminator";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...