使用malloc(C89)

时间:2017-01-03 13:18:28

标签: c linked-list malloc

我正在尝试在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;

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

想知道我做错了什么。包括stdlib。

2 个答案:

答案 0 :(得分:5)

您只修改list main永远不会看到的linkedlist* init(void) { // <<< linkedlist* list = malloc(sizeof(linkedlist)); // <<< list->size = 0; return list; // <<< } int main(int argc, char** argv){ linkedlist* list = init(); // <<< return 0; } 的本地副本。你可能想做这样的事情:

list

如果您必须保留原始功能签名,则不得修改init中的void init(linkedlist* /* const */ list){ list->size = 0; } int main(int argc, char** argv){ linkedlist list; //<<< init(&list); //<<< return 0; 。你可以这样做:

woid

答案 1 :(得分:2)

在C中,所有参数都按值传递。因此list中的init变量是listmain值的副本,而且正在修改该副本。因此,在功能之外没有看到变化。

您需要将list地址传递给init,并将该函数更改为接受指针指针。

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

int main(int argc, char** argv){
    linkedlist *list;
    init(&list);
    return 0;
}