Стандарт C99 6.7.8.14 говорит
Массив символьного типа может быть инициализирован литералом символьной строки, необязательно заключенным в фигурные скобки. Последовательные символы литерала строки символов (включая завершающий нулевой символ, если есть место или если размер массива неизвестен) инициализируют элементы массива.
Это означает, что следующие утверждения эквивалентны.
char str[4] = "ABC\0";
// equivalent to
char str[4] = "ABC";
// equivalent to
char sr[4] = {'A', 'B', 'C', '\0'};
Так что нет ничего плохого в первом утверждении выше. Как прямо указано в стандарте, для инициализации массива в качестве размера массива используется только то количество символов в строковом литерале. Обратите внимание, что строковый литерал "ABC\0"
на самом деле содержит пять символов. '\0'
такой же, как и любой другой персонаж, так что все в порядке.
Однако обратите внимание, что есть разница между
char str[4] = "ABC\0";
// equivalent to
char str[4] = {'A', 'B', 'C', '\0'};
char str[] = "ABC\0"; // sizeof(str) is 5
// equivalent to
char str[] = {'A', 'B', 'C', '\0', '\0'};
Это связано с тем, что строковый литерал "ABC\0"
содержит 5
символов, и все эти символы используются при инициализации str
, когда размер массива str
не указан. В отличие от этого, когда размер str
явно указан как 4
, то только первые 4
символов литерала "ABC\0"
используются для его инициализации, как ясно указано в приведенном выше абзаце стандарта.
person
ajay
schedule
18.04.2014
char str[] = "ABC";
- person David Heffernan   schedule 18.04.2014