编辑 - 之前发布的代码因为无法编译而被提出
假设我有以下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);
这是对的吗?
答案 0 :(得分: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);
在这种情况下,“节点”是指向单个结构黑客的指针。而这个实体的成员“arr”是另一个结构黑客阵列的另一个点。否则,您可以将数据构建为典型的链接列表。
更新:注意,节点和(node->arr)[i]
中的所有值都未初始化!在memset()
之后,您应该malloc()
将它们全部归零。或者确保在使用前分配有效值。如果在分配有效值之前使用它,则最好满足分段错误。在更糟糕的情况下,找出错误的地方需要花费你的时间。