-3

编辑 - 先前发布的代码已被讨论,因为它无法编译

假设我有以下 struct hack 变体:

typedef struct hack *Hack;
struct hack {
    char* value;
    Hack arr[1];
};

我到底应该分配什么?我应该做类似的事情:

malloc(sizeof(struct hack) + sizeof(struct hack)*(numElems-1));

可以缩短为:

malloc(sizeof(struct hack) * numElems);

那是对的吗?

4

1 回答 1

1

我认为您的第一个代码不正确。它是“不完整的元素类型”

typedef struct hack Hack;
struct hack {
    char* value;
    Hack arr[1];
};

等于:

struct hack {
    char* value;
    struct hack arr[1];  /* Here wrong */
};

在错误的地方,您尝试定义 的数组struct hack但是:的定义struct hack尚未完成。呵呵,修改一下。

对于您的新代码,它应该是:

typedef struct hack *Hack;
struct hack {
    char* value;
    Hack arr;
};
Hack node = malloc(sizeof(struct hack));
node->arr = malloc(sizeof(struct hack) * numElems);

在这种情况下,“节点”是指向单个结构 hack 的指针。该实体的成员“arr”是结构hack数组的另一个点。否则,您可以将数据构建为典型的链表。

更新:注意,节点中的所有值并(node->arr)[i]没有初始化!你应该memset()在它们全部归零之后立即malloc()。或者确保在任何使用之前分配一个有效值。如果您在分配有效值之前使用它,最好是遇到分段错误。在更糟糕的情况下,您需要花费数天时间才能找出问题所在。

于 2013-04-03T21:01:36.013 回答