求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?相关的知识,希望对你有一定的参考价值。

求助 一个指针被free之后什么时候是NULL?还是不可能是NULL?
例如
int *p;
free(p);

一个指针,除非本身等于NULL,否则free以后不会等于NULL。因为free不对指针的值做任何操作,而只是试图改变指针指向的一片连续的存储器空间的状态。如果这片存储器空间是malloc或其它兼容方式(例如POSIX库函数strdup)分配过来的,那么会释放这片空间,释放的空间可以之后再次被分配。如果指针本来就等于NULL,则调用free不会有任何作用。除以上两种情况外(包括再次free已经被free过的非空指针),free的行为是未定义的,比较有可能的是free这个指针进程在某个时刻突然莫名其妙地崩溃。
int *p;
free(p);
这段代码如果是连续的,只能在函数内出现,那么int* p;是局部自动变量,不会隐式初始化为0(NULL)。未初始化的变量的值是不确定的(一般运气不会好到就是0;例如Microsoft Visual Debugger会在Debug模式下给未初始化的栈每个字节填充0xcc,根本不可能是0),直接free的后果不可预料。
为了防止错误地free掉已经被释放的指针,建议free某个指针之后立刻把这个指针赋值为NULL。
====
[原创回答团]

参考资料:原创

参考技术A free(p) 并不会对p本身的值做改变。所以p的值不变!

可能会改变p指向的那块内存值。这个要看是什么编译器。

然而绝对会改变的就是 p所指向的那块内存的状态,free之前这块内存是属于本进程的,其他进程不可以合法访问,操作系统也不会分配给其他进程或者线程。

free之后那块内存就成为自由内存,可供操作系统分配任意进程。

所以被free之后的内存就不要访问,否则可能会跟其他进程“打架”
参考技术B if (p=NULL)
.........................

试一试就知道了

野指针的学习

1、野指针

    野指针是指向了“垃圾”内存的指着。

2、产生原因

    (1)指针变量没有被初始化。任何指针变量刚刚被创建的时候,是不会自动变成NULL指针的,他的缺省值是随机的,这个时候指针是乱指的。所以指针变量在被创建的同时应该被初始化,让指针指向合法的内存。

    (2)指针P被free或者delect之后,没有设置为NULL;当指着被free之后,其实就是释放了指针指向这块内存进行释放,也就是说指针依旧是指向这个地址,但是这个地址上面的东西不要了,并且系统也不会将这块内存继续保留。后面有可能将这个地址分配给别人,所以free掉之后,有的时候指针还是可以继续操作,但是很有可能系统恰叫将这块内存分配给别人。就会出现程序的崩溃。

    (3)指针的操作超越了变量的作用范。

错误示范:

char *p = (char *)malloc(100);
strcpy(p, "hello");    
printf("p = %s\n", p);
free(p);
strcpy(p, "world");
printf("p = %s\n", p);

    指针 p 被free之后,其实就是将p指向的这块内容进行释放,系统也对这块内存不在保留,以后别人malloc 的时候,就会将这个内存分配给别人。所以free 掉之后,就不要再继续使用指着p,会导致程序的崩溃。

解决办法:

char *p = (char *)malloc(100);
strcpy(p, "hello");
printf("p = %s\n", p);
free(p);
p = NULL;
p = (char *)malloc(100);
strcpy(p, "world");
printf("p = %s\n", p);

    指针p 被释放之后,赋值为NULL;后面的可以通过判断 p != NULL 进行判断。被使用之后的指针,绝对不要在继续使用了,重新使用的话,要重新申请新的内存地址,或者指向新的合法的地址。

以上是关于求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?的主要内容,如果未能解决你的问题,请参考以下文章

结构体指针在使用完free后,该指针所指向的内存区域是啥,这个指针是变成了NULL,还是野指针。

请问C语言free(p)释放p所指向的动态内存后p指向哪?是NULL还是随机还是啥呢?

C语言中, 为了避免野指针,是否可以在free和delete之后,把指针置为NULL就可以避免了?

free(p),是啥意思?是单纯p==NULL还是说p指向的内容变为空。使用free()之后 p和内存的状态是啥情况的

指针free后还存在吗?

关于C语言free函数的问题