C语言 使用 malloc (C89) 在 main() 之外初始化结构



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

您只是在修改main永远不会看到的list的本地副本。您可能想执行以下操作:

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;

在 C 中,所有参数都是按值传递的。 所以init中的list变量是mainlist值的副本,而正在修改的正是该副本。 因此,在函数之外看不到更改。

您需要将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;
}

相关内容

  • 没有找到相关文章

最新更新