Нет, код не должен (обязательно) указывать на ошибку. Segfault возникает при попытке доступа к странице виртуальной памяти, которая не выделена для вашего процесса.
«Куча» или «бесплатный магазин» - это область страниц виртуальной памяти, принадлежащая вашему процессу. API malloc()
подразделяет эту область на блоки и возвращает указатель на блок.
Если вы обращаетесь за пределами конца блока, на который у вас есть указатель, вы обычно получаете доступ к памяти, которая является частью кучи, но не частью вашего выделенного блока. Таким образом, вы можете повредить другие блоки кучи или даже структуры данных, которые malloc()
использует для определения кучи.
Для получения дополнительной информации о повреждении кучи и методах его обнаружения в отладочной версии вашего кода, это отличная книга:
Написание твердого кода: методики Microsoft по разработке программ на C без ошибок, автор Steve Maguire
Приложение для педантиков: в редких случаях, получая доступ к памяти за концом блока кучи, вы можете получить доступ к памяти, которая не является частью кучи. В этих случаях вы можете получить ожидаемую ошибку сегментации. Вы также можете испортить какую-то другую структуру данных, кроме кучи. Это действительно случайность. Однако сама куча очень велика по сравнению с типичными блоками кучи, поэтому 99% временного кода, такого как ваш пример, повредит кучу. Приведенный вами пример относится к этому случаю на 99%.