假设我们使用avr-gcc
来编译具有以下结构的代码:
typedef struct {
uint8_t bLength;
uint8_t bDescriptorType;
int16_t wString[];
} S_string_descriptor;
我们像这样全局地初始化它:
const S_string_descriptor sn_desc PROGMEM = {
1 + 1 + sizeof L"1234" - 2, 0x03, L"1234"
};
让我们检查一下它产生了什么:
000000ac <__trampolines_end>:
ac: 0a 03 fmul r16, r18
ae: 31 00 .word 0x0031 ; ????
b0: 32 00 .word 0x0032 ; ????
b2: 33 00 .word 0x0033 ; ????
b4: 34 00 .word 0x0034 ; ????
...
因此,确实,字符串内容根据需要遵循结构的前两个元素。
但是,如果我们尝试检查sizeof sn_desc
,则结果为2
。
变量的定义在编译时完成,sizeof
也是一个编译时运算符。那么,为什么sizeof var
没有显示var
的真实大小?以及在哪里记录了编译器的这种行为(即向结构中添加任意数据)?
答案 0 :(得分:1)
sn_desc
是指向闪存的2字节指针。它旨在与LPM
等一起使用,以检索实际数据。无法获取此数据的实际大小;单独存放。