我是 c 的新手,所以如果我的步骤有误,请告诉我。假设我有如下内容:
struct graphNode{
int val;
graphNode* parent;
int succSize;
int succMaxSize;
graphNode* succ[1];
};
我将创建一个新节点:
graphNode *n;
n = malloc(sizeof(struct graphNode));
assert(n);
n->val = 1;
n->parent = NULL;
n->succSize = 0;
n->succMaxSize = 1;
那么,如果我想给节点添加一个后继者
if (n->succSize == n->succMaxSize){
n->succ = realloc(n->succ, sizeof(graphNode*) * n->succMaxSize * 2);
n->succMaxSize *= 2;
}
n->succ[succSize] = n2; //n2 is of type graphNode*
succSize++;
这是正确的吗?我是否也需要为结构重新分配,或者数组的重新分配是否足够?我需要为初始数组分配内存吗?初始数组大小是否应该包含在我对 n 的 malloc 调用中?
最佳答案
在 C 中定义“弹性”数组成员的通常方法是指定大小为 0
或根本不指定大小,例如:
struct foo {
int stuff;
bar theBars[]; // or theBars[0]
};
根据这个定义,sizeof(struct foo)
将包括末尾数组以外的所有元素,您可以通过说 malloc(sizeof(struct foo) 分配正确的大小) + numberOfBars * sizeof(bar))
.
如果您需要重新分配它以更改 bar
元素的数量,那么您将使用相同的公式(但使用新的 numberOfBars
)。
需要明确的是,您不能只是 realloc
结构的一部分。您必须 realloc
整个事情。
关于c - 我应该如何使用包含数组的结构进行 malloc/realloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19438014/