如何声明和定义具有多个可变长度数组的结构?

Posted

技术标签:

【中文标题】如何声明和定义具有多个可变长度数组的结构?【英文标题】:how to declare and define a structure with multiple variable length arrays? 【发布时间】:2021-11-01 14:40:03 【问题描述】:

问题描述:有 3 个宏(配置参数)被用作多个结构中数组的索引。现在,我想将这些宏重新定义为变量,从闪存读取它们各自的值,然后用作结构中数组的索引。

struct1
    int Array1[macro1];
    int Array2[macro2];
;

struct2
    int Array1[macro1];
    int Array2[macro1];
;

struct3
    int Array1[macro1];
    int Array2[macro3];
;

如果描述不完整,请追问。

谢谢

【问题讨论】:

macro1 是 VLA 的大小还是索引?请注意,“可变修改类型不能是结构或联合的成员。” (ref) 类似问题:***.com/q/66629951/4989451 description is not complete, please ask. 我问。我不明白 - ArrayN 没有打字,; 不见了。 i want to redefine these macros as variables which read“重新定义宏”?为什么不定义一个读取的函数(函数做动作,变量自己什么都不做)? @Yun 它将定义大小。但是,当我将这些宏转换为变量时,会导致“在文件范围内修改变量”的错误。 这能回答你的问题吗? Flexible array member without having to be the last one 【参考方案1】:

GCC 支持它,但它是一个“意想不到的”扩展......真的。

但是,这些类型只能在函数体范围内定义。 请参阅 answer 以了解示例性用法。

【讨论】:

这件事还有一个问题:***.com/questions/12058760/… @Aconcagua,是的.. 这个扩展不应该在 GCC 世界之外使用【参考方案2】:

呼吁常识

假设您想要各种不同的数组 size 取决于存储在闪存中的值,那么您不能使用 VLA 也不能使用动态内存。

假设您在闪存中的大小变量称为X。存在最大允许值X 的最坏情况,我们称之为MAX_X。您的代码需要在这种最坏的情况下工作 - 当大小为 MAX_X 时,它不能被允许越界访问数组并跑到树林中。

这意味着您需要以下解决方案:

typedef struct

  int array [MAX_X];
  int size_used;
 some_type;

实际使用的数组大小由some_type my_type = .size_used=X; ;获取

将数组作为 VLA 是无稽之谈,因为您的代码无法提前知道 X 的大小。它必须始终留出MAX_X 项。认为当程序不使用它们时通过分配更少的字节来节省某种内存是完全错误的。您的程序不知道它将使用多少内存。

现在,如果有人告诉您使用 malloc,那么您就知道他们可能从未见过 MCU,更不用说使用过...

【讨论】:

以上是关于如何声明和定义具有多个可变长度数组的结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个数组拆分成多个固定长度的数组

如何自定义一个长度可变数组

创建一个具有可变长度数组的接口,其中包含 TypeScript/Angular4 中的对象

我们可以有一个可变长度数组类型的结构元素吗? [复制]

如何使用可变长度类型将包含多个 std::vector<float> 的结构写出到 HDF5?

OpenCL中不允许使用可变长度数组声明 - 为什么?