Bro*_*s B 5 c parameters constructor struct pointers
#include <stdio.h>
#include <stdlib.h>
typedef struct {
unsigned length;
} List;
void init(List *l) {
l = (List *) malloc(sizeof(List));
l->length = 3;
}
int main(void) {
List *list = NULL;
init(list);
if(list != NULL) {
printf("length final %d \n", list->length);
return 0;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
这是代码的简化版本,它给我带来了问题.我试图*list从*list作为参数传递的方法构造指针.
我知道我可以void init(List *l)通过更改它来完成工作,void init(List **l)但这是一个课程教程.我无法更改方法参数.我花了四个小时研究这个问题.
我想确保void init(List *l)在面对我的教授之前没有办法做工作.
提前致谢
您将指针的副本传递给init,该指针正在分配内存,将其存储在其本地副本中,并在init返回时立即泄漏它。您无法通过这种方式将数据传递回调用函数。您需要返回分配的数据,或者传入一个指向您要修改的指针的指针,这两者都涉及修改函数签名。
void init(List **l) {
*l = (List *) malloc(sizeof(List));
(*l)->length = 3;
}
init(&list);
Run Code Online (Sandbox Code Playgroud)
作业是否指定您必须List从内部分配init?如果没有,您始终可以将指针传递给已分配的List对象,并执行length = 3占位符的任何初始化:
void init(List *l) {
l->length = 3;
}
List list;
init(&list);
printf("length final %d \n", list.length);
Run Code Online (Sandbox Code Playgroud)