Всякий раз, когда вы частично инициализируете массив, оставшиеся элементы заполняются нулями.(Это правило в стандарте C, C17 6.7.9 §19.)
Поэтому char m1[40] = "Computer";
заканчивается в памяти следующим образом:
[0] = 'C'
[1] = 'o'
...
[7] = 'r'
[8] = '\0' // the null terminator you automatically get by using the " " syntax
[9] = 0 // everything to zero from here on
...
[39] = 0
Теперь, конечно, \0
и 0
означает то же самое, значение 0. Любой из них будет интерпретирован как нулевой терминатор.
Если вы перезапишете индекс 26, а затем распечатаете массив как строку, он будет печататься только до тех пор, пока не встретит первый нулевой терминатор в индексе 8.
Если вы сделаете это такоднако:
#include <stdio.h>
int main()
{
char m1[40] = "Computer";
printf("%s\n", m1); // prints out "Computer"
m1[8] = 'K';
printf("%s\n", m1); // prints out "ComputerK"
}
Вы перезаписываете нулевой терминатор, и следующий ноль, который оказался в массиве, вместо этого обрабатывается как нулевой терминатор.Этот код работает только потому, что мы частично инициализировали массив, поэтому мы знаем, что больше нулей в конце.
Если бы вы вместо этого написали
int main()
{
char m1[40];
strcpy(m1, "Computer");
Это не инициализация, а присвоение во время выполнения.strcpy
будет устанавливать только индекс от 0 до 8 («Компьютер» с нулевым термином в индексе 8).Оставшиеся элементы будут оставлены неинициализированными для значений мусора, и запись m1[8] = 'K'
уничтожит строку, так как она больше не будет надежно завершаться нулем.При попытке распечатать вы получите неопределенное поведение: что-то вроде вывода мусора или сбоя программы.