包含二维数组类型的 C 结构定义

标签 c arrays struct variable-length-array type-2-dimension

我想包含一个可变长度的二维数组指针作为结构的一部分,但 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/

相关文章:

c - 在这个简单的例子中,为什么我没有从 gcc 收到 "used uninitialized"警告?

python - python中的数组操作

C++ 将对数组的引用传递给 C 函数

java - 一组 3D 点的聚类

c - 如何声明一个带有链表的结构体变量?

c - 传入C的二维数组

c - 使用结构和数组的 Strcmp 的 If 语句不起作用

c++ - 为什么在比较范围内的数字时,汇编代码中会出现分支?

java - 如何使用结构进行冒泡排序

pointers - Nasm - 按值和地址访问结构元素