gpt4 book ai didi

c - 使用预先计算的成员长度在堆栈上分配结构的宏

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

我有一个结构形式:

typedef struct node {
unsigned int * keys;
unsigned int * branches;
} NODE;

键和分支的数量在运行时确定,但已知。它派生自另一个结构:

typedef struct tree {
unsigned int num_keys_per_node;
} TREE;

为了给这个TREE分配一个NODE,手动步骤是:

NODE node;
unsigned int keys[tree->num_keys_per_node];
unsigned int branches[tree->num_keys_per_node + 1];

node.keys = keys;
node.branches = branches;

我需要在紧密循环中分配很多这样的节点,只是在我遍历数据结构时临时分配,随着节点遍历的继续而迅速丢弃它们。我可以编写一个函数,返回一个指针和 malloc() 堆上的键和分支,然后手动返回 free() 它们,但我更喜欢使用堆栈如果可能的话。

由于这个初始化逻辑会在很多地方重复,我该如何定义一个宏,这样我才能有效地做一些事情,比如:

NODE node = CREATE_NODE_FOR_TREE(tree);

我很难找到一种方法来执行此操作,这将导致预处理器提供有效的语法。

也很高兴听到在堆栈内存上进行动态结构分配的其他方法。

编辑 |我绝不会同时需要内存中的多个节点,因此我也可以重复使用一个结构。

最佳答案

尝试将 node 作为参数传递给宏,如下所示:

#define CREATE_NODE_FOR_TREE( \
node, \
tree) \
\
unsigned int keys[tree->num_keys_per_node]; \
unsigned int branches[tree->num_keys_per_node + 1]; \
\
node.keys = keys; \
node.branches = branches;

...
NODE node = {0};
CREATE_NODE_FOR_TREE(node, tree);
...

此解决方案假定至少是 c99。

关于c - 使用预先计算的成员长度在堆栈上分配结构的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160326/

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