在里面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)
哪里有问题?为什么结果不一样?
您的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);.
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |