c - 我应该如何使用包含数组的结构进行 malloc/realloc?

标签 c arrays struct malloc realloc

我是 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/

相关文章:

c - 需要左值作为赋值的左操作数。这意味着什么?

c - UDP C 服务器不接收数据包

javascript - Array.from 不适用于 jasmine

sql - 如何检查 Postgres 中的数组是否为空

c - 添加到结构的外部数组。 (C 编程语言)

c - 在c中用struct提取位域

c - 代码 "DECLDIR __declspec(dllexport)"到底有什么作用?

c - g-wan 更新 servlet

java - JSON-encode Java for PHP 中的对象数组和数组

c - 将结构传递给函数指针 - 值更改