gpt4 book ai didi

c - 只要它们包含 "next"字段,是否可以在 C 中为不同的列表结构编写通用遍历函数?

转载 作者:行者123 更新时间:2023-12-04 09:06:29 27 4
gpt4 key购买 nike

第一次问问题,但我确实环顾了 Google 和 stackoverflow,看看以前是否有人问过类似的问题。在 malloc, recasting and free ,看起来 OP 问了类似的问题。但它更复杂。

我想知道是否有可能在 C 中为遍历列表的列表结构创建通用函数,因为您知道不同类型的结构总是有一个“下一个”字段。

例如,给定这两个列表类型结构:

typedef struct _list1 {
int value;
list1 *next;
} list1;

typedef struct _list2 {
int value;
char *string;
list2 *next;
} list2;

是否可以创建一个通用的 void freeList((void *) list) 函数或类似下面的东西?我知道为每个单独的列表分别编写两个免费函数是一件简单的事情。

void freeList((void *) list) {
// Included this because the structs would have different sizes
// so I thought it would be possible to cast it in order to properly dereference the field.
if (sizeof *list == sizeof list1)
*list = (list1) list;
else if (sizeof *list == sizeof list2)
*list = (list2) list;

if (!list) return;
else {
free(list->next);
free(list);
}
}

到目前为止,由于 gcc 会提示取消引用 void * 指针,所以我对上面显示的代码进行的实验效果不佳。

最佳答案

制作异构列表可以通过使用标记 union 或仅使用标记和转换来实现:

struct list_item {
struct list_item *next;
enum datatype type;
void *contents;
};

struct list_item {
struct list_item *next;
enum datatype type;
union {
int some_int;
char some_char;
} contents;
};

然后在遍历列表时,您只需在使用元素的内容之前验证存储在 type 中的类型。


此检查:

if (sizeof *list == sizeof list1)
*list = (list1) list;
else if (sizeof *list == sizeof list2)
*list = (list2) list;

不起作用,因为 sizeof 是一个静态结构:它的值是在编译时定义的。您只是要求 sizeof void

关于c - 只要它们包含 "next"字段,是否可以在 C 中为不同的列表结构编写通用遍历函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58967652/

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