>我正在尝试在 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
变量是main
中list
值的副本,而正在修改的正是该副本。 因此,在函数之外看不到更改。
您需要将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;
}