【问题标题】:C struct definition containing 2-dimensional array type包含二维数组类型的 C 结构定义
【发布时间】:2018-05-09 01:13:37
【问题描述】:

我想包含一个可变长度二维数组指针作为结构的一部分,但 c99 编译器在 Array anArray 行上给我以下错误:“flexible array member in else empty struct”。

typedef const int Array[][2];

typedef struct {
    Array anArray;
} StructType;

Array myArray = {{1,2},{3,4},{5,6}};

StructType myStruct = { myArray };

如果您能深入了解这个问题和解决方案,我将不胜感激。我最终会向StructType 添加其他组件。

【问题讨论】:

  • 我不太明白你想要做什么。
  • 灵活数组只允许作为struct 的最后一个成员,具有多个命名成员;你不能有一个struct,它的唯一成员是一个灵活的数组。在更正此问题后,我不认为您可以按照自己的方式初始化灵活数组。
  • 不是一个数组指针。它是一个数组。无论如何,使用这种 FAM 的定义将完全没有用,因为结构分配不会复制数组,因此,无论如何,您都必须使用 memcpy。什么说明了该数组中有多少 元素?!什么都没有。

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


【解决方案1】:

结构需要知道数组的大小,而这里你缺少一维。如果声明和初始化同时完成,你可以例如

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}} };

【讨论】:

    【解决方案2】:

    感谢 cmets。我将代码更改为以下,现在它可以编译了。

    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 };
    

    【讨论】:

      【解决方案3】:

      您在不知情的情况下创建了一个具有灵活数组成员的结构。通常在 C 中,结构和联合的所有成员都需要具有完整的类型,即它们的长度必须在编译时准确知道。但是,最后一个成员有一个例外,它不需要而是变成"flexible array member"。您的问题是结构中没有任何其他成员,这是不合法的(我无法提出为什么这是 atm 的令人信服的理由)。在结构中存储指针当然不等于存储完整的数组,但它可能更像你想要的(至少作为初学者)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 2012-02-28
        • 1970-01-01
        • 2021-09-22
        相关资源
        最近更新 更多