Динамическое распределение памяти в C - PullRequest
1 голос
/ 16 июня 2011

Я просто экспериментирую с языком c, не могли бы вы ответить на мой вопрос относительно программы, которую я написал?последние 30 байтов будут освобождены и использованы для будущего распределения памяти.какой будет выход?

Ответы [ 2 ]

10 голосов
/ 16 июня 2011

Вы не должны освобождать любые адреса, кроме тех, которые возвращены malloc(), calloc() или realloc(). И p + 20 нет такого адреса. http://codepad.org/FMr3dvnq показывает, что такой free(), скорее всего, потерпит неудачу.

Функция free () освобождает пространство памяти, на которое указывает ptr, , которое должно быть возвращено предыдущим вызовом malloc (), calloc () или realloc () . В противном случае или, если free (ptr) уже был вызван ранее, происходит неопределенное поведение . Если ptr равен NULL, никакие операции не выполняются.

Должен ли указатель, переданный free (), указывать на начало блока памяти или он может указывать на внутреннюю часть? также стоит прочитать.

Даже если вы могли бы использовать free() для любого указателя, который указывает на память malloc'd - ваш мог бы освободить его дважды, так как вы вызываете free() для более чем одной памяти в этой области , И двойные освобождения являются злом, поскольку они могут привести к дырам в безопасности.

2 голосов
/ 16 июня 2011

Это приведет к неопределенному поведению.

Функция free() должна привести к освобождению пространства, на которое указывает ptr;то есть сделано доступным для дальнейшего распределения.Если ptr является нулевым указателем, никаких действий не происходит.В противном случае, , если аргумент не совпадает с указателем, ранее возвращенным функцией calloc(), malloc(), posix_memalign(), realloc(), strdup(), или если пространство было освобождено при вызове free() или realloc(), поведение не определено .

...