Когда я объявил массив как char a [6], почему он позволяет мне присвоить значение в [7]?
Потому что ты сказал это сделать. Ты босс. Если вы скажете ему прыгнуть со скалы, он может.
Не нужно ли добавлять к последнему элементу нулевой символ?
Это не строка, это массив символов. Ему не нужен ноль в конце, если вы не хотите рассматривать его как строку. Передавая его через спецификатор %s
в printf
, вы рассматриваете его как строку, поэтому вам нужно добавить ноль в конце, в противном случае вы передаете что-то, что не является строкой через спецификатор формата, который требует строку.
Также p = a => p содержит адрес первого элемента массива символов a. Я не понимаю, как правильно ставить '&' перед адресом (p [0]). & p [0] означает адрес адреса первого элемента, который не имеет никакого смысла, по крайней мере для меня.
Работает так:
p
- указатель на первый элемент.
&p
- адрес указателя.
p[0]
- первый элемент в массиве, на который указывает указатель.
&p[0]
- это адрес первого элемента в массиве, на который указывает указатель.
Почему печатается правильный вывод?
Удача. Скорее всего, реализация, будучи 32-битным (4 байта), не могла сделать ничего полезного с двумя байтами после 6-байтового массива. Таким образом, он округлил его до 8 байтов, чтобы следующая вещь после него начиналась с четной 32-битной границы. Таким образом, вы использовали два байта, которые реализация ни для чего не использовала.