【问题标题】:Is this an acceptable use of malloc and free? (C)这是可接受的 malloc 和 free 用法吗? (C)
【发布时间】:2017-06-14 09:16:25
【问题描述】:

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

【问题讨论】:

  • 您认为*p2 = p1; 是什么意思?事后有哪些要点?
  • 对我来说这意味着 p2 指向的东西得到 p1 的地址。我认为双指针让我感到困惑。
  • @toastedDeli 可能尝试使用 printf() 打印所有变量(p1p2*p2 等)的地址,然后看看你是否能理解。
  • free(*p2); ==> free(p2); 看看你把malloc的返回值赋值给了什么。
  • @kaylum 不,OP 已经做了free(p1),但还需要free(p2),但不是free(*p2);

标签: c pointers memory-management malloc


【解决方案1】:

也许图片会有所帮助。假设第一个malloc 返回地址0x10,第二个malloc 返回地址0x30。所以在前五行代码之后,情况是这样的:

`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)后,你的情况是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2011-11-19
    • 2011-04-14
    • 2015-04-23
    相关资源
    最近更新 更多