【问题标题】:Dynamically allocate memory for an array of unions inside a struct为结构内的联合数组动态分配内存
【发布时间】:2021-11-27 08:31:21
【问题描述】:

我不确定我是否接近这个正确,但我想要做的是为结构内的联合数组动态分配内存,我可以使用

Registers regs[20];

但我不希望它固定为 20*2 字节。 相反,我想要这样的东西:

typedef union
    uint16_t reg;
    uint8_t low;
    uint8_t high;
}Registers;

typedef struct{
    uint8_t updateIntervall;  
    uint8_t prio;
    Registers *regs;         // <--- Array of unions 
}Config;


uint8_t amount = 4;
Config cfg;
cfg.regs = malloc((amount * 2) * sizeof(uint8_t));

我猜是这样的

Config cfg;

已经初始化了结构,所以这应该不起作用。

我猜我的做法完全错误,所以如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

  • 您要分配amount 寄存器。因此它应该是malloc((amount * sizeof(Registers)) 或更好的malloc((amount * sizeof(*cfg.regs))。它在结构中的事实是无关紧要的
  • uint8_t low; uint8_t high;在联合中很奇怪。我想你的意思是union { uint16_t reg; struct { uint8_t low, hight; }}
  • @Jabberwocky 为什么malloc((amount * sizeof(*cfg.regs))malloc((amount * sizeof(Registers)) 好?能否给我一个链接来解释这种差异?
  • 对于x = malloc(amount * sizeof(*x)),我们只讨论xamount。对于x = malloc(amount * sizeof(struct somestruct)),您需要确定x 实际上是指向struct somestruct 的指针。没有什么能阻止你写x = malloc(amount * sizeof(struct someotherstruct))。第一个版本不易出错。
  • @Jabberwocky 哦,现在我明白了。谢谢。

标签: c dynamic-memory-allocation


【解决方案1】:

我会换一种方式。 nregs 是数组的大小

typedef struct{
    uint8_t updateIntervall;  
    uint8_t prio;
    Registers regs[];         // <--- Array of unions 
}Config;

Config *cfg=malloc(sizeof(*cfg) + nregs * sizeof(cfg->regs[0]));

【讨论】:

  • 我以前试过这个,但我认为我做的不对,如果我检查 sizeof(cfg) 并增加 nregs 大小不会改变。
  • @yellowt 完全按照应有的方式进行操作。它适用于 100% 文件。你根本不明白sizeof 做了什么。指针的大小不给出分配对象的大小,只给出指针本身的大小。在 C 语言中,没有办法获得分配的大小。
  • 好吧,这解释了很多。有没有办法查看 cfg 实际上有多大?现在的一个问题是我可以或多或少地做 cfg.regs[whatever number],没有限制,要获得限制,我是否必须在结构中指定大小,如 Registers regs[MAX_SIZE] ?
  • @yellowtape 在 C 中无法查看分配的对象有多大。您需要将其他成员添加到结构中以获取 regiaters 的数量。
  • @yellowtape C 标准对此的定义是:“作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,灵活数组成员被忽略。特别是,结构的大小就好像灵活数组成员被省略了一样,除了它可能有比省略更多的尾随填充会暗示。”
猜你喜欢
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多