Motive:将struct传递给函数,例如我们可以引用它并修改它的原始指针。
typedef struct thing{
char x;
}thing_t;
#include <stdio.h>
#include <stdlib.h>
void f1(thing_t *bob, thing_t *boby) {
bob->x = 'y';
boby = bob;
printf("f1 boby after: %c\n", boby->x);
}
int main(void) {
thing_t *foo, *foofy;
foo=(struct thing_t*)malloc(sizeof(struct thing));
foo->x = 'x';
printf("foo before: %c\n", foo->x);
f1(foo,foofy);
printf("foo after: %c\n", foo->x);
printf("foofy after: %c\n", foofy->x);
return 0;
}
输出是:
foo before: x
f1 boby after: y
foo after: y
Segmentation fault (core dumped)
你可以看到:
boby = bob;
这些不会修改指针foofy,所以它不会得到任何参考。我希望foofy-&gt; x的值为y。任何帮助表示赞赏。
答案 0 :(得分:1)
foofy
指向main()
中没有任何地方。它包含的值是不确定的(一些垃圾值)。这就是为什么当你试图访问它时 - 它导致了分段错误。访问您不允许访问的内存。
如果您要更改foofy
&foofy
foofy
或地址void f1(thing_t *bob, thing_t **boby) {
bob->x = 'y';
(*boby) = bob;
printf("f1 boby after: %c\n", (*boby)->x);
}
,请对其进行更改。
f1(foo,&foofy);
你会这样称呼它
foo before: x
f1 boby after: y
foo after: y
foofy after: y
输出将在进行这些更改时
x
同样,您不会以相同的方式看到结构bob
的{{1}}更改值。
C是按值传递的。 这就是为什么在前面的情况下,传递的参数的副本是我们在被调用函数中进行更改的对象。复制中的更改不会反映main()
中对象中的更改。
您需要做的事情很少 - 1)不需要转换malloc
的返回值。 2)检查malloc
返回的值,以防它返回NULL
单独处理它。
答案 1 :(得分:0)
foofy
是结构指针,它没有初始化,它指向哪里?这就是为什么以下陈述给出seg.fault
。
printf("foofy after: %c\n", foofy->x);
首先将有效地址分配给foofy
,然后您可以执行foofy->x
注意:当您调用f1
函数时,您可能会想到thing_t *boby
,foofy
也会被初始化,但事实并非如此。 boby
是本地结构指针,仅在f1
函数中有效。