通过外部函数释放内存

1 c malloc free pointers

在里面main()我创建了指针p并通过malloc();分配它 然后我将其内部值(数据)设置为222。由于某种原因,我需要一个函数:
首先:释放指针的内存。
第二:使指针指向新结构。我是通过bar函数做到的。(运行正常,输出正确。)

    #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
Run Code Online (Sandbox Code Playgroud)

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

#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
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*awn 5

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

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

    free(*f);

    *f = g;
}
Run Code Online (Sandbox Code Playgroud)

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