这是malloc和free的可接受使用吗?(C)
我目前正在学习C语言。我的讲师给我举了一个使用malloc和free的坏例子,但对我来说似乎还可以。代码如下:这是malloc和free的可接受使用吗?(C),c,pointers,memory-management,malloc,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所在位置的指针吗?我认为他的意思是做自
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)是不好的。我说得对吗?也许一张照片会有帮助。假设第一个
malloc
返回地址0x10
,第二个malloc
返回地址0x30
。在前五行代码之后,情况如下所示:
调用free(p1)
后,您会遇到如下情况:
请注意,
p1
和*p2
现在都是悬空指针,它们都指向已释放的内存。因此,free(*p2)
行无效,您试图释放已释放的内存。相反,您希望释放(p2)
以释放位置0x30
的内存,您认为*p2=p1代码>意味着什么?事实发生后,什么点在哪里?对我来说,这意味着p2点的东西得到p1的地址。我认为双指针让我困惑。@Toastedli可能会尝试使用printf()打印所有变量的地址(p1
,p2
,*p2
等),然后看看您是否能理解。free(*p2)代码>==>免费(p2)
查看您将返回值从malloc
分配给的对象。@kaylum否,OP已经执行了free(p1)
,但也需要free(p2)
,但不是free(*p2)代码>
`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`.