我正在尝试在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。
答案 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
变量是list
中main
值的副本,而且正在修改该副本。因此,在功能之外没有看到变化。
您需要将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;
}