求助 一个指针被free之后什么时候是NULL?还是不可能是NULL?
求助一个指针被free之后什么时候是NULL?还是不可能是NULL?例如int*p;free(p);...
求助 一个指针被free之后什么时候是NULL?还是不可能是NULL?
例如
int *p;
free(p); 展开
例如
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。
====
[原创回答团]
int *p;
free(p);
这段代码如果是连续的,只能在函数内出现,那么int* p;是局部自动变量,不会隐式初始化为0(NULL)。未初始化的变量的值是不确定的(一般运气不会好到就是0;例如Microsoft Visual Debugger会在Debug模式下给未初始化的栈每个字节填充0xcc,根本不可能是0),直接free的后果不可预料。
为了防止错误地free掉已经被释放的指针,建议free某个指针之后立刻把这个指针赋值为NULL。
====
[原创回答团]
参考资料: 原创
展开全部
free(p) 并不会对p本身的值做改变。所以p的值不变!
可能会改变p指向的那块内存值。这个要看是什么编译器。
然而绝对会改变的就是 p所指向的那块内存的状态,free之前这块内存是属于本进程的,其他进程不可以合法访问,操作系统也不会分配给其他进程或者线程。
free之后那块内存就成为自由内存,可供操作系统分配任意进程。
所以被free之后的内存就不要访问,否则可能会跟其他进程“打架”
可能会改变p指向的那块内存值。这个要看是什么编译器。
然而绝对会改变的就是 p所指向的那块内存的状态,free之前这块内存是属于本进程的,其他进程不可以合法访问,操作系统也不会分配给其他进程或者线程。
free之后那块内存就成为自由内存,可供操作系统分配任意进程。
所以被free之后的内存就不要访问,否则可能会跟其他进程“打架”
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
if (p=NULL)
{.........................}
试一试就知道了
{.........................}
试一试就知道了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询