Intereting Posts
Можно ли повторно использовать opendir в C? Cython эквивалент c определяет #define myfunc (узел x, …) SetNode (x.getattributeNode (), __ VA_ARGS__) Печать диапазона адресов памяти в qemu Неявное объявление функции «закрыть» Ошибка: несовместимые типы при назначении типа ‘char ‘ из типа ‘char *’ C – Неопределенные символы для архитектуры x86_64 при компиляции на Mac OSX Lion Как разрешить больше памяти и избежать переполнения стека на множестве рекурсии? Создайте DLL для обмена памятью между двумя процессами Android NDK – как функционировать вызов другой предварительно построенной библиотеки Понять поведение backspace (\ b) в C Самый быстрый способ умножить два 64-битных int на 128-битные, а затем >> на 64-битные? Где выделена память при создании этого массива? (С) Недостатки вызова realloc в цикле создание streamа внутри дочернего процесса d2i_RSA_PUBKEY, d2i_RSAPrivateKey и d2i_RSAPublicKey возвращает NULL

Почему не освобождает () освобождает все выделенные ячейки памяти?

Я не знаю, что я делаю что-то неправильно или если моя концепция несколько неправильна

#include #include int main() { int *p; p=calloc(3,sizeof(int)); p[0]=10; p[1]=15; p[2]=30; printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2); free(p); //p=NULL; printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2); return 0; } 

Когда выполняется 2-й, printf (), он показывает p [2] = 30, тогда как p [0] = p [1] = 0 (в gcc ubuntu и некоторые условные значения в windowsх Code :: Blocks). У меня есть 2 вопроса.

  1. Почему free () освобождает первые 2 указателя, а не третье. один?
  2. Почему значения, показанные 0 в ubuntu, когда кажется правильным показывать суровые значения?

Я новичок, поэтому, пожалуйста, несите меня. Я пробовал то же самое с malloc (), и то же самое происходит.

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

Цитирование C11 , приложение §J.2, Неопределенное поведение

Используется значение указателя, которое ссылается на пространство, освобожденное вызовом функции free или realloc .

Чтобы уточнить, вызов free() на указатель не устанавливает указатель на NULL или что-то еще. Он просто отмечает память как повторно используемую менеджером памяти. Это место памяти (указатель) больше недействительно для программы, поэтому вы не должны его использовать.

В качестве превентивной меры для вышеупомянутой проблемы считается хорошей практикой кодирования, чтобы установить указатель на NULL явно после вызова free() . Однако FWIW это не обязательно .

Цитирование C11 , глава 7.22.3.3

free функция заставляет пространство, на которое указывает ptr освобождается, то есть становится доступным для дальнейшего выделения. […]

Кроме того, просто добавить, partial free() невозможно, позвонив free() , в любом случае. Вы можете обратиться к этому предыдущему ответу за разъяснениями .