我应该如何malloc/realloc与包含数组的结构?

Lun*_*nyx 3 c arrays malloc struct realloc

我对c很新,所以如果我的步骤有误,请告诉我.假设我有以下内容:

struct graphNode{
    int val;
    graphNode* parent;
    int succSize;
    int succMaxSize;
    graphNode* succ[1];
};
Run Code Online (Sandbox Code Playgroud)

我将创建一个新节点:

graphNode *n;
n = malloc(sizeof(struct graphNode));
assert(n);
n->val = 1;
n->parent = NULL;
n->succSize = 0;
n->succMaxSize = 1;
Run Code Online (Sandbox Code Playgroud)

然后,如果我想向节点添加后继者

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++;
Run Code Online (Sandbox Code Playgroud)

它是否正确?我是否需要为结构重新分配或者是否足够重新分配数组?我需要malloc作为初始数组吗?初始数组大小是否应包含在我的malloc调用n中?

dan*_*uzz 7

在C中定义"弹性"数组成员的常用方法是指定大小0或根本不指定大小,例如:

struct foo {
    int stuff;
    bar theBars[]; // or theBars[0]
};
Run Code Online (Sandbox Code Playgroud)

使用此定义,sizeof(struct foo)将包括末尾除阵列之外的所有元素,并且您可以通过说明来分配正确的大小malloc(sizeof(struct foo) + numberOfBars * sizeof(bar)).

如果您需要重新分配它以更改bar元素的数量,那么您将使用相同的公式(但使用新的numberOfBars).

要清楚,你不能只是realloc结构的一部分.你必须完成realloc整个事情.