在下面的代码中,我释放了指针ptr
但仍然*ptr
重新调整了相同的值。如果我释放变量,那么它应该给我一些垃圾值,但它没有。
#include <stdio.h>
#include<stdlib.h>
int main()
{
int a=5;
int *ptr=&a;
printf("%d, %d n",a,*ptr);
free(ptr);
printf("%d, %d n",a,*ptr);
return 0;
}
您只能free
已分配的内存malloc
、calloc
或realloc
- 不能使用它来释放与auto
变量关联的内存(行为未定义):
int *ptr = malloc( sizeof *ptr );
*ptr = 5;
printf( "%dn", *ptr );
free( ptr );
如果你没有按照约翰·博德的回答自己分配内存,你就无法free
它。
但是,即使您确实分配了内存,free
也不会擦除指针指向的内存块的内容,它只是允许该内存块被其他东西使用,因此它会"释放"它,而不是"擦除"。如果在释放该内存块后没有其他事情发生写入该内存块,您的内容仍将保留在那里。
free(ptr)
不会更改ptr
的值。它只是要求内存管理软件释放ptr
指向的内存的预留。调用函数会传递其参数的值;它不传递有关其参数标识的任何信息,因此free
不会收到有关允许free
更改该变量的ptr
变量的任何信息。它只接收其值的副本。
此外,仅当传递以前由malloc
返回的地址或相关例程时,才会定义free
的行为。当给定命名对象的地址时,不会定义它,例如&a
。
两件事:
第一:ptr
包含的值不是分配有malloc
.
对于每个malloc
,必须有一个free
。 由于您正在free()
未与malloc
一起分配的内存,因此您正在调用未定义的行为(C 和C++程序员喜欢这个术语)
第二:由于你正在调用未定义的行为,行为可以是任何东西。一个看似正确的行为程序可能处于未定义行为的领域。 您很幸运,您一遍又一遍地获得相同的价值。在其他系统上,您的程序可能会崩溃,杀死无辜的奶奶或只是按下宇宙的删除按钮。