Я не знаю, что я делаю что-то неправильно или если моя концепция несколько неправильна
#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 вопроса.
Я новичок, поэтому, пожалуйста, несите меня. Я пробовал то же самое с malloc (), и то же самое происходит.
Использование памяти, которая уже была free()
-d, вызывает неопределенное поведение . Не делай этого.
Цитирование C11
, приложение §J.2, Неопределенное поведение
Используется значение указателя, которое ссылается на пространство, освобожденное вызовом функции
free
илиrealloc
.
Чтобы уточнить, вызов free()
на указатель не устанавливает указатель на NULL
или что-то еще. Он просто отмечает память как повторно используемую менеджером памяти. Это место памяти (указатель) больше недействительно для программы, поэтому вы не должны его использовать.
В качестве превентивной меры для вышеупомянутой проблемы считается хорошей практикой кодирования, чтобы установить указатель на NULL
явно после вызова free()
. Однако FWIW это не обязательно .
Цитирование C11
, глава 7.22.3.3
free
функция заставляет пространство, на которое указываетptr
освобождается, то есть становится доступным для дальнейшего выделения. […]
Кроме того, просто добавить, partial free()
невозможно, позвонив free()
, в любом случае. Вы можете обратиться к этому предыдущему ответу за разъяснениями .