[英]C struct definition containing 2-dimensional array type
我想将可变长度的二维数组指针作为结构的一部分,但是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
内存函数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}} };
感谢您的评论。 我将代码更改为以下代码,现在可以编译了。
typedef const int Array[][2];
typedef const struct {
int something;
Array *pAnArray;
} StructType;
Array myArray = {{1,2},{3,4},{5,6}};
StructType myStruct = { 0, &myArray };
您不知道做的是使用灵活的数组成员创建结构。 通常在C语言中,所有结构体和联合体成员都必须具有完整的类型,即它们的长度必须在编译时准确知道。 但是,最后一个成员有一个例外,它不需要但可以成为“灵活数组成员” 。 您遇到的问题是,结构中没有其他成员,这是不合法的(我无法提出令人信服的理由来解释为什么这是atm)。 在结构体中存储指针当然不等于存储完整的数组,但它可能更像您想要的(至少是初学者)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.