malloc(size)
возвращает место в памяти, где для использования доступно не менее size
байтов.Скорее всего, вы сможете записывать в байты сразу после s[size]
, но:
- Эти байты могут принадлежать другим битам вашей программы, что позже вызовет проблемы при выполнении.
- Или байты могут подойти для записи - они могут принадлежать странице, используемой вашей программой, но ни для чего не используются.
- Или они могут принадлежатьструктуры, которые
malloc()
использовал для отслеживания того, что использовала ваша программа.Это очень плохо! - Или они НЕ могут принадлежать вашей программе, что приведет к немедленной ошибке сегментации.Скорее всего, если вы откроете, скажем,
s[size + large_number]
Трудно сказать, какой из них произойдет, потому что доступ за пределы пространства, которое вы запросили malloc()
, приведет к неопределенному поведению.
В вашем примере, вы переполняете буфер , но не таким образом, который вызывает немедленный сбой.Помните, что C не проверяет границы при обращении к массиву / указателю.
Кроме того, malloc()
создает память в куче, но переполнение буфера обычно связано с памятью в стеке.Если вы хотите создать его в качестве упражнения, используйте
char s[3];
.Это создаст массив из 3 символов в стеке.В большинстве систем после массива не будет свободного места, поэтому пространство после s[2]
будет принадлежать стеку.Запись в это пространство может перезаписать другие переменные в стеке и, в конечном итоге, вызвать ошибки сегментации, скажем, перезаписав указатель возврата текущего фрейма стека.* если sizeof(char)
равен 1 байту
sizeof(char)
фактически определено стандартом всегда равным 1 байту.Однако размер этого 1 байта может не быть 8 бит в экзотических системах.Конечно, в большинстве случаев вам не нужно об этом беспокоиться.