我想包含一个可变长度的二维数组指针作为结构的一部分,但 c99 编译器在 Array anArray
行上给我以下错误:“灵活数组成员否则为空结构”。
typedef const int Array[][2];
typedef struct {
Array anArray;
} StructType;
Array myArray = {{1,2},{3,4},{5,6}};
StructType myStruct = { myArray };
如果您对此问题和解决方案有任何见解,我将不胜感激。我最终会将其他组件添加到 StructType
。
最佳答案
结构需要知道数组的大小,而这里您缺少一维。如果同时进行声明和初始化,您可以例如
int Array[][2] = {{1,2},{3,4},{5,6}};
然后编译器为数组腾出空间并设置值(否则必须在运行时使用动态分配)。
其次,不幸的是,在 C 中,初始化数组的实用方法是不可能的
StructType myStruct = { myArray };
这必须在运行时完成(例如,在动态分配的情况下,C 会在执行这种赋值时遇到一些麻烦,因为没有机制可以使对象大小保持最新)。
不过,您可以做的是设置缺失维度的大小,并借助内存函数 memcpy
typedef const int Array[3][2];
typedef struct {
Array anArray;
} StructType;
int main(int argc, char **argv) {
Array myArray = {{1,2},{3,4},{5,6}};
StructType myStruct;
memcpy(myStruct.anArray,myArray,sizeof(myArray));
结构声明和初始化也可以这样进行
StructType myStruct = { {{1,2},{3,4},{5,6}} };
在C99中,甚至
StructType myStruct = { .anArray = {{1,2},{3,4},{5,6}} };
关于包含二维数组类型的 C 结构定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47483139/