【问题标题】:How to initialize structure having unint_t as flexible array member? [duplicate]如何初始化具有 unint_t 作为灵活数组成员的结构? [复制]
【发布时间】:2021-03-19 07:34:33
【问题描述】:

我定义了一个struct,有一个成员类型是uint8_t,这个成员存放mac地址。

在 Arduino IDE 上编程。

结构:

typedef struct devInfo{
  uint8_t address[];
  unsigned int count;
  unsigned int filePos;
}struct_devInfo;
  • 问题 1:

我用这两种方式赋值,但是不能给变量赋值。

方法一> struct_devInfo slave = {{0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6}, 0, 0};

方法二> slave.address[] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6};

我如何访问这种类型的值?

  • 问题 2:

我将使用这个结构的变量, salve1、slave2...等

除了结构,还有什么更好的办法吗? 你能示范一下吗?

【问题讨论】:

  • “不起作用”怎么办?我本来希望方法 1 可以工作,但方法 2 不行,因为你不能分配数组。对于问题 2,您想要“一些更好的方法”,但不清楚您指的是什么。
  • @PaulHankin 我的意思是我想为 uint8_t 这个变量存储一个值,我尝试使用两种方法来做这件事。
  • 保罗的意思是你应该edit你的问题并告诉你如何知道它不起作用。例如一条错误消息。

标签: c arduino flexible-array-member


【解决方案1】:

具有灵活数组成员的结构需要是结构中的最后一个成员。改为

typedef struct devInfo{
  unsigned int count;
  unsigned int filePos;
  uint8_t address[];
}struct_devInfo;

那么你需要分配足够的内存:

struct_devInfo *p = malloc(sizeof *p + size);

那么你可以这样做:

const uint8_t initArr[] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6};
memcpy(p, initArr, sizeof initArr);

但由于它似乎是一个不需要灵活成员的字段,我会改用它:

typedef struct devInfo{
  unsigned int count;
  unsigned int filePos;
  uint8_t address[6]; // Specify the size
}struct_devInfo;

那你就不用分配内存了

【讨论】:

  • 另一种解决方案可能是使其成为address[6](或设备地址的最大大小)。那么使用memcpy 分配值仍然是关键。 malloc 不是必需的。
  • 如果我想在声明变量的时候给一个值,像这样strcut_devInfo slave = {MACADDRESS, 0 ,5};,我可以这样做吗?
  • @Rain 灵活的成员,没有
猜你喜欢
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 2020-04-13
  • 2020-07-18
  • 1970-01-01
  • 2012-11-22
  • 2020-10-27
  • 1970-01-01
相关资源
最近更新 更多