Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是malloc和free的可接受使用吗?(C)_C_Pointers_Memory Management_Malloc - Fatal编程技术网

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

这是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所在位置的指针吗?我认为他的意思是做自

我目前正在学习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)是不好的。我说得对吗?

也许一张照片会有帮助。假设第一个
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`.