gpt4 book ai didi

c - 我的链表有什么问题?

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:11 24 4
gpt4 key购买 nike

int main(int argc, char *argv[])
{
printf("successfully started main\n");
struct uf_list myList;
uf_list_allocate(&myList);
printf("successfully allocated myList\n");
insert_node(&myList, 'c');
printf("successfully inserted into myList\n");

return 0;
}

...

void uf_list_allocate(struct uf_list *list)
{
list = malloc(sizeof(struct uf_list));
if(list == NULL)
{fprintf(stderr, "no memory for allocate");}
list->head = list->tail = NULL;
}
//--------------------------------------------------------------------------------------
void insert_node(struct uf_list *list, const char label)
{
struct uf_node *it = malloc(sizeof(struct uf_node));
if(it == NULL)
{fprintf(stderr, "no memory for insert");}

it->c = label;
it->next = NULL;
it->rep = NULL;

if(list->head == NULL) //the list is empty
{ list->head = list->tail = it;}
else
{ list->tail->next = it; list->tail = it; }

it->rep = list->head;
}
/*----------------------------------------------------------------------------*/
struct uf_node
{
char c;
struct uf_node *next;
struct uf_node *rep;
};
/*----------------------------------------------------------------------------*/
struct uf_list
{
struct uf_node *head;
struct uf_node *tail;
};

当我尝试从 main 向我的列表中插入一个元素时,我遇到了段错误。是什么导致了段错误?如果您需要任何更多信息,例如 structs 的定义,请告诉我!

编辑:我意识到我做了什么。在 allocate 中,我更改了局部变量 list. 的地址,这意味着 myList 没有发生任何事情。但是,现在我有以下困惑:我将 myList 的声明放在 main, 之外,一切正常:

struct uf_list myList;

int main(int argc, char *argv[])
{
printf("successfully started main\n");
uf_list_allocate(&myList);
printf("successfully allocated myList\n");
insert_node(&myList, 'c');
insert_node(&myList, 'd');
insert_node(&myList, 'e');
printf("successfully inserted into myList\n");
print_uf_list(&myList);


return 0;
}

我不太明白为什么。似乎应该应用相同的逻辑,即,由于我将 myList 的地址传递给 allocate,然后更改局部变量 list 地址并对该地址进行操作,如何这反射(reflect)在 myList 上,其内存地址未被操作?

最佳答案

在分配中,你不返回任何东西。达是问题所在。在 main 中,您应该只有一个指针作为局部变量,并将分配器函数返回的内容分配给它。

编辑

更简单,因为它已经被分配(在 main 的堆栈上),你可以从那个函数中删除分配代码,并有一个初始化函数。这就是您所需要的:

  Uf_list_init(struct uf_list *list)
{
list->head = list->tail = NULL;
}

原代码中:

list = malloc(sizeof(struct uf_list));

您有一个指向 te 结构的指针,但您用一个全新的指针覆盖了它。

关于c - 我的链表有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22770968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com