Нет, код не должен (обязательно) давать segfault. При попытке доступа к странице виртуальной памяти, которая не выделена для вашего процесса, возникает segfault.
«Куча» или «свободный магазин» - это область виртуальных страниц памяти, принадлежащая вашему процессу. API malloc()
подразделяет эту область на блоки и возвращает указатель на блок.
Если вы обращаетесь за пределы блока, к которому у вас есть указатель, вы обычно будете получать доступ к памяти, которая является частью кучи, но не является частью выделенного блока. Таким образом, вы можете испортить другие блоки кучи или даже структуры данных, которые malloc()
использует для определения кучи.
Для получения дополнительной информации о куче коррупции и способах обнаружения его в отладочной версии коды, это отличная книга:
Writing Solid Code: Microsoft's Techniques for Developing Bug-Free C Programs by Steve Maguire alt text http://ecx.images-amazon.com/images/I/5148TK6JCVL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
Дополнения для педантичного: В редких случаях , путем доступа к памяти за пределами кучи блока, вы можете получить доступ к памяти, которая не является частью кучи. В этих случаях вы можете получить ошибку сегментации, которую вы ожидали. Вы также можете испортить некоторую другую структуру данных, чем кучу. Это действительно случайность. Однако сама куча очень велика по сравнению с типичными блоками кучи, поэтому 99% временного кода, такого как ваш пример, испортит кучу. Пример, который вы предоставляете, относится к этому 99% -му делу.
Наверное, просто повезло. –
Вы написали 5 к месту, которое не принадлежало вам. Если владельцу этого места не понравилось то, что вы сделали с его домом, он отомстит. ** Опасайтесь **, он может принадлежать вашему USB-дисководу, и он отформатирует следующий диск, который вы вставляете. – pmg
@pmg: Реально, это не очень вероятно в современной операционной системе с защищенным режимом. – bcat