[英]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;
}
不需要所有free
和malloc
魔法。 如果您已经为这种类型分配了新的 memory,为什么还要分配它? 完全没有意义。
void bar(foo *f)
{
f->data = 333;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.