使用malloc(C89)初始化main()之外的结构

Tri*_*han -2 c malloc linked-list

我正在尝试在C中实现双向链表,我需要使用初始化函数,同时保持一个大小字段.我的代码如下:

typedef struct element{
    struct element* next;
    struct element* prev;
    int value;
}element_t;

typedef struct linkedlist{
    element_t* head;
    element_t* tail;
    int size;
}linkedlist;

void init(linkedlist* list){
    list = malloc(sizeof(linkedlist));
    list->size = 0;
}

int main(int argc, char** argv){
    linkedlist* list;
    init(list);
    return 0;
Run Code Online (Sandbox Code Playgroud)

当我尝试在init函数中访问list-> size时,我得到正确的值,但是当我尝试从main访问list-> size时,程序返回一个奇怪的,大的负值(可能是十六进制的地址) .

想知道我做错了什么.stdlib包括在内.

Pau*_*l R 5

你只是修改一个本地副本listmain将永远不会看到.你可能想做这样的事情:

linkedlist* init(void) { // <<<
    linkedlist* list = malloc(sizeof(linkedlist)); // <<<
    list->size = 0;
    return list; // <<<
}

int main(int argc, char** argv){
    linkedlist* list = init(); // <<<
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你要保持原有功能的签名,那么你一定不能修改listinit.你可以这样做:

void init(linkedlist* /* const */ list){
    list->size = 0;
}

int main(int argc, char** argv){
    linkedlist list; //<<<
    init(&list); //<<<
    return 0;
Run Code Online (Sandbox Code Playgroud)