繁体   English   中英

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

[英]passing struct pointer to function doesn't modifiy the references

动机:将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-> x的值等于y。 任何帮助表示赞赏。

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

同样,您也不会以相同的方式看到struct bobx更改值。 C是按值传递。 这就是为什么在较早的情况下,传递的参数的副本是我们在被调用函数中进行了更改的对象。 复制中的更改不会使其反映main()对象中的那些更改。

您需要做的几件事是-1)不需要malloc的返回值。 2)检查malloc返回的值(如果它返回NULL ,请分开处理。

foofy是结构指针,它没有初始化,它指向的是什么? 这就是下面的语句给出seg.fault的原因。

printf("foofy after: %c\n", foofy->x);

首先为foofy分配有效地址,然后您可以执行foofy->x

注意:当您调用f1函数时,您可能会想通过抓住thing_t *boby foofy ,而foofy也被初始化了,不是。 boby是本地结构指针,仅在f1函数中有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM