gpt4 book ai didi

c - 灵活的数组成员,不必是最后一个

转载 作者:行者123 更新时间:2023-12-02 18:52:00 24 4
gpt4 key购买 nike

我想弄清楚 C 中是否有一种变通方法可以在结构中拥有一个灵活的数组成员,这不是最后一个。例如,这会产生编译错误:

typedef struct __attribute__((__packed__))
{
uint8_t slaveAddr; /*!< The slave address byte */

uint8_t data[]; /*!< Modbus frame data (Flexible Array
Member) */

uint16_t crc; /*!< Error check value */

} rtuHead_t;

这不会产生错误:

typedef struct __attribute__((__packed__))
{
uint8_t slaveAddr; /*!< The slave address byte */

uint8_t data[]; /*!< Modbus frame data (Flexible Array
Member) */

} rtuHead_t;

typedef struct __attribute__((__packed__))
{
rtuHead_t head; /*!< RTU Slave addr + data */

uint16_t crc; /*!< Error check value */

} rtu_t;

但是不起作用。如果我有一个字节数组:data[6] = {1, 2, 3, 4, 5, 6}; 并将其转换为 rtu_t,然后 crc 成员将等于 0x0302,而不是 0x0605

有没有办法在结构(或结构中的结构)中间使用灵活的数组成员?

最佳答案

它不能在 ISO C 中完成。但是...

GCC 有一个扩展,允许在结构中定义可变修改类型。所以你可以这样定义:

#include <stddef.h>
#include <stdio.h>

int main() {
int n = 8, m = 20;
struct A {
int a;
char data1[n];
int b;
float data2[m];
int c;
} p;

printf("offset(a) = %zi\n", offsetof(struct A, a));
printf("offset(data1) = %zi\n", offsetof(struct A, data1));
printf("offset(b) = %zi\n", offsetof(struct A, b));
printf("offset(data2) = %zi\n", offsetof(struct A, data2));
printf("offset(c) = %zi\n", offsetof(struct A, c));
return 0;
}

除了一些关于使用非 ISO 功能的警告外,它编译正常并产生预期的输出。

offset(a) = 0
offset(data1) = 4
offset(b) = 12
offset(data2) = 16
offset(c) = 96

问题是这种类型只能在 block 范围内定义,因此不能用于将参数传递给其他函数。

但是,它可以传递给嵌套函数,这是 GCC 的另一个扩展。示例:

int main() {
... same as above

// nested function
int fun(struct A *a) {
return a->c;
}
return fun(&p);
}

关于c - 灵活的数组成员,不必是最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66629951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com