По существу, доступ к pointer[-1]
, как вы это делали, дает неопределенное поведение; в теории, ничего может случиться. Но на практике есть хорошее объяснение конкретного сообщения об ошибке, которое вы получили.
Напомним, что malloc
должен сохранить размер выделенного фрагмента памяти, чтобы free
мог работать правильно. На некоторых системах - и кажется, что ваш находится среди этой группы - эта информация хранится в памяти непосредственно перед адресом, возвращаемым malloc
. (. Это может быть интересно для распечатки этого значения, если вы хотите узнать о реализации вашей системы)
Когда вы перезаписали, что часть памяти, вы оставили внутренности malloc
- системы free
в неустойчивом состоянии, что приводит free
сообщить об ошибке, когда это было обнаружено. Наиболее вероятным временем для такого открытия, конечно, является то, когда функции управления памятью называются об этой области памяти. (Некоторые malloc
коррупции будут обнаружены при следующем вызове malloc
, но для достижения этого обычно требуется более целенаправленное усилие.) Вызов realloc
должен дать вам аналогичное сообщение об ошибке.
Какой компилятор? – asheeshr
Более чем вероятно, член кучи, размер блока и другая информация сохраняются в памяти сразу * до * до возвращаемого адреса из 'malloc()'. Замена этих данных на коррупцию не изменит способность использовать фактический блок. Скорее, когда это необходимо (во время свободного), возникает коррупция и заворачивает свою уродливую голову. Но ** это полностью зависит от реализации **. – WhozCraig
Если вы делаете глупые вещи, ожидайте глупого поведения. В этом случае вы изменяете память, которая не принадлежит вам. Поэтому вы должны ожидать неожиданного. –