gpt4 book ai didi

c - 使用 int 指针简单测试 malloc 和 free 会导致双重释放或损坏错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:28:09 27 4
gpt4 key购买 nike

为了了解有关指针的更多信息,我只编写了一个简单的测试函数,它创建一个指针,分配空间并在 shell 上进行一些输出后释放空间。

void main() {
int *p = (int*) malloc(sizeof(int));
int a = 42;
printf("p: %x\n", p);
printf("*p: %d\n", *p);
printf("a: %s\n", a);
printf("&a: %x\n", &a);
p = &a;
printf("p: %x\n", p);
printf("*p: %x\n", *p);

//Until now everything works as expected
free(p); //ERROR
// printf("p: %x\n", p); // Shall cause error, because space was freed
// printf("*p: %x\n", *p); // Shall cause error, because space was freed
}

一开始运行一切正常。 free(p) 没有导致错误。然后我用一个结构尝试了相同的测试并得到了双重免费错误。 “好吧,也许我做错了什么,让我们从头开始”,我想,然后 Ctrl+Z 将所有内容都放到上面这个,就像以前一样。现在我仍然收到此错误。为什么?这是一个新手问题,我知道。上面的代码可以在网络上随处找到,作为 malloc 和 free 的简单演示。喜欢这里:http://www.cplusplus.com/reference/cstdlib/free/希望有人能告诉我我做错了什么。

最佳答案

传递给free()的指针必须从之前调用malloc()(或calloc()realloc())返回。情况并非如此,因为 p 在以下位置之后有 a 的地址:

p = &a;

p 然后被传递给 free() 导致未定义的行为。

请注意,在问题中链接的页面示例中,在调用任何动态分配函数后,指针没有被重新分配。


以下代码片段中的注释 “应导致错误,因为已释放空间” 不正确:

free(p); //ERROR
// printf("p: %x\n", p); // Shall cause error, because space was freed

因为打印指针的地址是安全的,无论它关联的内存是否为free()。如果您尝试访问已被free()d 的内存,它一个错误,因此此评论是正确的:

// printf("*p: %x\n", *p); // Shall cause error, because space was freed

因为 p 正在被引用并且正在尝试读取 free()d 内存。


这是一个错误:

printf("a: %s\n", a); /* Must be '%d' as 'a' is an 'int'. */

注意:

printf("p: %x\n", p);

也是未定义的行为:对指针使用 %p 格式说明符。参见 Correct format specifier to print pointer (address)?


Do I cast the result of malloc?

关于c - 使用 int 指针简单测试 malloc 和 free 会导致双重释放或损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16378106/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com