Это зависит от того, что вы собираетесь делать со строками.
Определение
char array[][5] = {"game", "house"};
инициализирует array
с размерами 2
и 5
.array[0]
будет инициализирован с элементами 'g', 'a', 'm', 'e', '\0'
и array[1]
как 'h', 'o', 'u', 's', 'e'
.Обратите внимание на отсутствие завершающего '\0'
на array[1]
.
То, что происходит затем, зависит от того, что ваш код впоследствии сделает с массивом.Например,
for (i = 0; i < 2; ++i)
{
for (j = 0; j < 5, ++j)
{
if (array[i][j] != '\0')
printf("%c", array[i][j]);
else
j = 5; /* terminate the inner loop */
}
printf("\n");
}
с радостью напечатает две строки с game
и house
до stdout
, поскольку циклы специально ограничивают себя, чтобы не получить доступ к элементу массива вне границ.
Однако
for (i = 0; i < 2; ++i)
{
printf("%s\n", array[i]);
}
будет иметь неопределенное поведение, так как формат %s
будет печатать каждый символ array[i]
до тех пор, пока не будет найден завершающий '\0'
.Поскольку array[1]
инициализируется без завершения '\0'
, printf()
обычно будет проходить за концом массива, т.е. проходить через любую память, расположенную сразу после конца array
, и печатать любой мусор, который найдет добывает найти персонажа со значением '\0'
.Если в памяти нет такого символа, доступного для программы, то программа может просто продолжать печатать символы мусора и затем аварийно завершать работу (например, если операционная система хоста обнаруживает, что программа обращается к памяти, она не должна, а затем принудительно завершает программу).
Общее правило: если вы используете какие-либо функции, которые предполагают наличие завершающего '\0'
(printf()
с форматом %s
, strcat()
, strcmp()
и т. Д. И т. Д.), То ононеобходимо убедиться, что терминатор присутствует.Это означает, что в массиве достаточно элементов И инициализация одного из этих элементов '\0'
.
Если вместо этого array
инициализировать как
char array[][6] = {"game", "house"};
, тогда оба array[0]
и array[1]
иметь требуемый терминатор.