【问题标题】:C language array with dynamic size in structure结构中具有动态大小的 C 语言数组
【发布时间】:2021-11-15 14:56:30
【问题描述】:

我已经搜索了很多,但还没有找到 c 的任何好的解决方案。我想用动态大小初始化一个数组。到目前为止我看到的解决方案是一个链表,但它似乎不符合我的要求。

目前我测试的代码如下

typedef struct 
{
    const unsigned char widgetCount;
    unsigned char index;
    lv_obj_t * radiobtnVIEW[widgetCount];
}AssetVIEW;

然后去初始化widgetCount

AssetVIEW View={4};

我得到的错误是

error: 'widgetCount' undeclared here (not in a function)

这个新手非常感谢您的帮助。

【问题讨论】:

  • 您似乎正在寻找的是flexible array member。或普通指针。无论哪种方式,如果没有动态分配(即malloc 和朋友),您都无法解决它。
  • 这能回答你的问题吗? What is a flexible array member in a struct?
  • @kaylum 编译器会抛出这个错误错误:'sizeof' 对不完整类型'struct AssetVIEW'的无效应用
  • 你什么时候做什么?我们看不到您的代码,因此您需要具体说明。在新问题中提供minimal reproducible example
  • 如果您遇到新错误,请发布新问题。

标签: arrays c pointers size


【解决方案1】:

在 C 中,您不能在声明结构时引用结构中的其他字段。这就是错误消息所指的内容。如前所述,您可以使用指针或灵活的数组成员 (fam):

lv_obj_t **radiobtnVIEW;
lv_obj_t *radiobtnVIEW[];

对于 fam,您可以为所述字段动态分配内存:

size_t n = 4;
AssetVIEW *View = malloc(sizeof(*View) + n * sizeof(*View->radiobtnVIEW));
...
free(View);

请注意,widgetCount 上的 const 限定符没有意义,因为您无法对其进行初始化。

【讨论】:

  • 那么可以在结构中嵌入数组大小吗?我的意思是设置widgetCount并省略变量n。在 C++ 中可以吗?
  • 您将尺寸嵌入到结构中,但在创建实例时您无法引用该字段。如果您愿意,您可以 malloc 实例,设置 widgetCount,然后使用 widgetCount 重新分配,但不确定您为什么要这样做。如果你使用指针而不是fam,那么你只需按顺序执行,首先分配widgetCount,然后使用widgetCount分配和设置radiobtnVIEW。
  • 原因是我正在开发 MCU,我应该在其上跟踪 RAM 使用情况,因此使用绝对大小初始化结构中的数组非常重要。另一方面,最好有一个样本和一个模板,并以不同的尺寸使用它。类似于 CPP 中引入的面向对象编程。
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2014-11-11
  • 2013-07-14
相关资源
最近更新 更多