繁体   English   中英

免费 memory 由外部 function

[英]Free memory by external function

main()中,我创建了指针p并由malloc()分配它; 然后我将其内部值(数据)设置为222 出于某种原因,我需要一个 function :
第一:释放指针的memory。
第二:使指针指向新结构。 我是通过酒吧function 做到的。 (它工作正常,output 是正确的。)

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct foo_s
    {
        int data;
    } foo;
    
    void bar(foo *f)
    {
        free(f);
    
        foo *g = malloc(sizeof(foo));
        g->data = 333;
    
        f = g;
    }
    
    int main()
    {
       foo *p = malloc(sizeof(foo));
       p->data = 222;
    
       bar(p);
       printf("%d", p->data);
    }
    // output is 333

但是当我free移动到下面的几行(不应该改变结果的地方)时,output 会显示其他内容。

#include <stdio.h>
#include <stdlib.h>

typedef struct foo_s
{
    int data;
} foo;

void bar(foo *f)
{
    foo *g = malloc(sizeof(foo));
    g->data = 333;

    free(f); // moved here

    f = g;
}

int main()
{
   foo *p = malloc(sizeof(foo));
   p->data = 222;

   bar(p);
   printf("%d", p->data);
}
// output is 7149104

问题出在哪里? 为什么结果不一样?

你的bar() function 释放了传递给它的地址,但是在main()中,在调用bar(p)之后, p仍然指向旧的,现在释放的 memory 地址。 取消引用未定义的行为; 看到旧数字、新数字、某个随机值可能会发生各种事情,您的程序可能会崩溃或召唤鼻恶魔……基本上,您不能那样做。 bar()需要获取指向指针的指针,以便它可以修改调用者的 scope 中的变量:

void bar(foo **f)
{
    foo *g = malloc(sizeof(foo));
    g->data = 333;

    free(*f);

    *f = g;
}

然后被称为bar(&p) 或者, bar()可以返回新地址,并用作p = bar(p); .

void bar(foo *f)
{
    foo *g = malloc(sizeof(foo));
    g->data = 333;

    free(f); // moved here

    f = g;
}

不需要所有freemalloc魔法。 如果您已经为这种类型分配了新的 memory,为什么还要分配它? 完全没有意义。

void bar(foo *f)
{
    f->data = 333;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM