为什么这个悬空指针即使在释放内存后仍显示相同的内存地址?

问题描述 投票:0回答:1

为什么下面程序中的悬空指针在释放内存后仍显示相同的内存地址?

#include <stdio.h>
#include <stdlib.h>

int main()
{
int a = 1;

int *ptr_a = (int*)malloc((sizeof(int)));

ptr_a = &a;

printf("The address of 'a' is %p\n", ptr_a);

free(ptr_a); // A dangling pointer

printf("The address of 'a' is %p", ptr_a);

return 0;
}

我尝试了一切,但仍然遇到同样的问题。

c gcc gcc-warning
1个回答
0
投票

代码首先通过调用

malloc
分配内存,并将返回的地址存储在
ptr_a
中。然后它将局部变量
a
的地址分配给
ptr_a
。此时,
malloc
返回的内存地址丢失,导致永久内存泄漏。

然后将

ptr_a
(即
a
的地址)传递给
free
。这是未定义的行为。您只能将
malloc
realloc
calloc
等获得的指针传递给
free

存储在

ptr_a
中的指针不会因对
free
的调用而更改,因此它会打印相同的地址(除非由于对
free
的错误调用导致未定义的行为而导致出现严重错误)。

© www.soinside.com 2019 - 2024. All rights reserved.