Когда вы пишете a[4]
, это то же самое, что и написание *(a + 4)
. Поскольку компилятор не знает, сколько памяти выделено по адресу, на который указывает a
, он с радостью позволит вам обратиться к памяти.
Однако в памяти, расположенной там, может быть что угодно - это может быть другая переменная, используемая вашей программой, частью стека или просто вне пределов вашей программы. Доступ к внешнему выделенному пространству таким образом, скорее всего, приведет (в лучшем случае) к ошибке сегментации или (в худшем случае) приведет к созданию дыры в безопасности, перезаписав другие части вашей программы.
Вы правы в том, что вы можете назначить только a[0]
или a[1]
безопасно, но компилятор Си позволит назначить за пределами этого границы (потому что он не знает, по-другому).
Небезопасно делать a[4]
в вашем примере.
Кроме того, это лучше not to cast the result of malloc - see this answer