gpt4 book ai didi

c - 是否有可能在 C 中一般释放链表的内存

转载 作者:行者123 更新时间:2023-12-04 11:22:02 25 4
gpt4 key购买 nike

如果我在 C 中有多个链接结构,例如:

struct structA {
int a;
int b;
struct structA *next;
}

struct structB {
char a;
int b;
struct structB *next;
}

然后我像这样动态分配内存:

struct structA *mystructA = (struct structA*) malloc(sizeof(struct structA));
mystructA->next = (struct structA*) malloc(sizeof(struct structA));

struct structB *mystructB = (struct structB*) malloc(sizeof(struct structB));
mystructB->next = (struct structB*) malloc(sizeof(struct structB));

我是否总是必须像这样为每个结构类型释放它:

struct structA *p, *pNext;
for (p = mystructA; p != NULL; p = pNext) {
pNext = p->next;
free(p);
}

struct structB *p, *pNext;
for (p = mystructB; p != NULL; p = pNext) {
pNext = p->next;
free(p);
}

或者有什么通用的解决方案吗?我假设没有其他解决方案,因为 free() 过程必须知道必须释放多少字节。但也许我错了,有人可以更好地教我。

最佳答案

标准方法是使“列表部分”成为结构的第一个元素,并让每个派生 结构共享相同的前缀。由于第一个元素保证放置在偏移量零处,因此这将起作用。示例片段:

#include <stdlib.h>
#include <string.h>

struct list {
struct list *next;
};
struct structA {
struct list list;
int a;
int b;
};

struct structB {
struct list list;
char a;
int b;
};

void *create_any(size_t size)
{
struct list *this;
this = malloc (size);
if (!this) return this;
memset(this, 0, size);
this->next = NULL;
return this;
}


void free_all_any(struct list **lp) {
struct list *tmp;
while ((tmp = *lp)) { *lp = tmp->next; free(tmp); }
}
#define CREATE_A() create_any(sizeof(struct structA))
#define CREATE_B() create_any(sizeof(struct structB))
#define FREE_A(pp) free_any((struct list **) pp)
#define FREE_B(pp) free_any((struct list **) pp)

int main(void)
{
struct structA *ap;
struct structB *bp;

ap = CREATE_A ();
bp = CREATE_B ();

// some code here ...

FREE_A( &ap);
FREE_B( &bp);

return 0;
}

这或多或少是 linux 内核中使用的方法,但是那里使用了更多的预处理器魔法。 (显然那里没有 malloc)

关于c - 是否有可能在 C 中一般释放链表的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17746586/

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