[英]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 bob
的x
更改值。 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.