C - 无法启动作为参数传递的指针

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)在面对我的教授之前没有办法做工作.

提前致谢

mea*_*gar 4

您将指针的副本传递给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)