将struct指针传递给函数不会修改引用

时间:2018-01-15 08:49:24

标签: c pointers struct

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。任何帮助表示赞赏。

2 个答案:

答案 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 *bobyfoofy也会被初始化,但事实并非如此。 boby是本地结构指针,仅在f1函数中有效。

相关问题