在C语言中将结构体指针传递给函数

25

我在将指向结构体的指针传递给函数时遇到了问题。我的代码如下所示。在主函数中调用 modify_item 后,stuff == NULL。我希望 stuff 是一个指向元素为5的 item 结构体的指针。我做错了什么?

void modify_item(struct item *s){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   s = retVal;
}

int main(){
   struct item *stuff = NULL;
   modify_item(stuff); //After this call, stuff == NULL, why?
}
3个回答

35
因为你是按值传递指针。函数对指针的副本进行操作,从未修改原始指针。
要么传递指向指针的指针(即struct item **),或者让函数返回指针。

在STS Balaji发布的下面代码中,我们不是通过值传递指针吗?那段代码之所以能工作,仅仅是因为我们传递了指针地址(即值),因为它是在堆上分配的吗? - user4252523

33
void modify_item(struct item **s){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   *s = retVal;
}

int main(){
   struct item *stuff = NULL;
   modify_item(&stuff);
或者
struct item *modify_item(void){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   return retVal;
}

int main(){
   struct item *stuff = NULL;
   stuff = modify_item();
}

1
如果函数“modify_item”想要更改作为参数传递的结构体成员,我建议您将代码修改如下。
void modify_item(struct item *s){
   s->element = 5;
}

int main(){
   struct item *stuff = malloc(sizeof(struct item));
   modify_item(stuff); 
}

这是一种非常好的第三种选择,比道格·C上述提到的更优。 - user4252523

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接