Когда вы пишете a[4]
, это то же самое, что и запись *(a + 4)
.Поскольку компилятор не знает, сколько памяти выделено по адресу, на который указывает a
, он с радостью позволит вам обратиться к памяти.
Однако в расположенной там памяти может быть что угодно - это может быть другая переменная, используемая вашей программой, часть стека или просто за пределами вашей программы.Такой доступ за пределы выделенного пространства может (в лучшем случае) вызвать ошибку сегментации или (в худшем случае) создать дыру в безопасности, перезаписав другие части вашей программы.
Вы правы в том, что можете толькоприсвойте a[0]
или a[1]
безопасно , но компилятор C позволит вам назначить за пределами этих границ (потому что он не знает ничего другого).
В вашем примере небезопасно делать a[4]
.
Кроме того, лучше не приводить результат malloc - см. Этот ответ