gpt4 book ai didi

c - 通用链表库中的列表创建功能出现问题

转载 作者:行者123 更新时间:2023-11-30 19:27:24 24 4
gpt4 key购买 nike

我发现了一个通用的链表库,我认为它会很有用。但 llist_create(void *new_data) 函数让我感到困惑。指针new_list被分配了两次。我可以看到,第一个 malloc 返回的地址将被第二个 malloc 覆盖。那么为什么要使用第一个malloc呢? (代码完美运行)

由于我很好奇,我尝试通过注释第一个 malloc 来运行。然后 gcc 给出警告“从不兼容的指针类型初始化”。运行代码会出现段错误。

struct node {
void *data;
struct node *next;
};

typedef struct node * llist;


llist *llist_create(void *new_data)
{
struct node *new_node;

//First alloc
llist *new_list = (llist *)malloc(sizeof (llist));
//Second alloc
*new_list = (struct node *)malloc(sizeof (struct node));

new_node = *new_list;
new_node->data = new_data;
new_node->next = NULL;
return new_list;
}

//Code which creates linked list in driver program
llist *my_list = llist_create(NULL);

最佳答案

看来您不熟悉 typedef在c.

typedef is a reserved keyword in the C and C++ programming languages. It is used to create an alias name for another data type.1 As such, it is often used to simplify the syntax of declaring complex data structures consisting of struct and union types, but is just as common in providing specific descriptive type names for integer data types of varying lengths.

现在看看这个声明:

typedef struct node * llist;   

这意味着,lliststruct node * 类型的别名。

在此声明中

llist *new_list = (llist *)malloc(sizeof (llist));

new_list的类型是llist *,它只不过是struct node **

因此,对 new_list 的第一次内存分配是针对指向 struct node 的指针,第二次分配是针对指向 struct node 的指针.

<小时/>

IMO,OP 发布的代码由于两个原因而令人困惑:
- typedef 指向结构的指针
- 创建列表和在该列表中添加节点这两个操作合并在一个函数中。

更具可读性的代码将是这样的:

struct node {
void *data;
struct node *next;
};

typedef struct node NODE;

struct llist {
NODE *head;
};

typedef struct llist LLIST;

LLIST *create_list() {
LLIST *llist = malloc(sizeof(LLIST));
if (llist == NULL)
exit(EXIT_FAILURE);

llist->head = NULL;
return llist;
}

NODE *create_ll_node(void *data) {
NODE *node = malloc(sizeof(NODE));
if (node == NULL)
exit(EXIT_FAILURE);

node->data = data;
node->next = NULL;
return node;
}

// The add function for inserting node at the start of list
// Parameter: pointer to LLIST
// data to be insert in node
void add_list_head(LLIST *llist, void *data) {
NODE *node = create_ll_node(data);
if (llist->head != NULL) {
node->next = llist->head;
}
llist->head = node;
}

//driver function
int main() {
LLIST *llist = create_list();
.....
.....

add_list_head(llist, <data>);
add_list_head(llist, <data>);
.....
.....

关于c - 通用链表库中的列表创建功能出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55780616/

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