c语言 - 为什么指针不自由,它不会给我带来相同的变量值吗?



在下面的代码中,我释放了指针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已分配的内存malloccallocrealloc- 不能使用它来释放与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++程序员喜欢这个术语)

第二:由于你正在调用未定义的行为,行为可以是任何东西。一个看似正确的行为程序可能处于未定义行为的领域。 您很幸运,您一遍又一遍地获得相同的价值。在其他系统上,您的程序可能会崩溃,杀死无辜的奶奶或只是按下宇宙的删除按钮。

相关内容

最新更新