这是malloc和free的可接受使用吗? (C)

时间:2017-01-28 21:44:04

标签: c pointers memory-management malloc

我目前正在学习C.我的讲师将此作为使用malloc和free的一个不好的例子,但对我来说似乎没问题。这是代码:

int *p1,**p2;
p1 = malloc(sizeof(int));
*p1 = 7;
p2 = malloc(sizeof(int*));
*p2 = p1;
free(p1);
free(*p2);

我的讲师声称释放p1和* p2会导致“未定义的行为”,但我不明白为什么。

我明白双重释放内存中相同的区域是坏的但不会* p2指向一个指向7的位置的指针?我认为他意味着做免费(p1)和免费(** p2)是坏事。我是对的吗?

1 个答案:

答案 0 :(得分:8)

也许一张照片会有所帮助。让我们假设第一个malloc返回地址0x10,第二个malloc返回地址0x30。因此,在前五行代码之后,情况看起来像这样:

enter image description here

`p1` is a pointer with value `0x10`,   
         which points to memory that contains the integer value `7`.  
`p2` is a pointer with value `0x30`,  
         which points to memory that contains a pointer with value `0x10` (a copy of the value in `p1`),   
         which points to memory that contains the integer value `7`.  

致电free(p1)之后,你会遇到这样的情况:

enter image description here

请注意,p1*p2现在都是悬空指针,它们都指向已被释放的记忆。因此,行free(*p2)无效,您尝试释放已经释放的内存。相反,您希望free(p2)释放位置0x30处的内存。