【发布时间】:2021-11-27 20:10:29
【问题描述】:
我的教授显示了以下代码:
void *p1=malloc(1024);
free(p1);
void *p2=malloc(1024);
if (p1==p2)
{
printf("Now What?")
}
他说不安全,但为什么呢?
我知道我们不应该尝试访问已释放的内存。但是,知道指针指向的位置是可以的,因为它只是一个普通的指针,只要我们不尝试从它指向的位置读取。
【问题讨论】:
-
在任何一种情况下都不应尝试从指针位置读取,因为在上述代码中内存内容是不确定的。但如果
p1和p2具有相同的值,则使用哪一个都没有关系。 -
这段代码 sn-p 不包含任何未定义的行为,因为它不访问存储在
p1中的地址处的内存。如果p2与p1具有相同的值,您甚至可以访问内存。malloc是否会返回之前freed 之前的内存地址,这取决于实现。 -
Per port70.net/~nsz/c/c11/n1570.html#6.2.4p2 - “当指针指向(或刚刚过去)的对象到达其生命周期的终点时,指针的值变得不确定。” 所以使用程序流控制的不确定值是未定义的行为。
-
@Bodo 您的评论,但很多赞成是不正确的。请参阅发布的答案。