gcc - 为什么`sizeof var`不显示真实大小?
问题描述
假设我们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
?编译器的这种行为(即,向结构中添加任意数据)记录在哪里?
解决方案
sn_desc
是一个指向闪存的 2 字节指针。它旨在与LPM
等一起使用以检索实际数据。无法获取此数据的实际大小;分开存放。
推荐阅读
- html - 如何计算 jquery 中每个无序列表的列表项数
- xml - SAML SP:信任 IdP 的证书
- javascript - 使用异步迭代器在 Node 中并行批处理请求和处理
- azure-devops - 在 Azure DevOps 管道中的何处存储构建项目?
- xampp - 为什么 xampp 不想从案例工作室 2 生成代码
- kotlin - 使用 MockK 捕获可变参数?
- node.js - 将 create-react-app 与旧节点版本一起使用
- godot - Godot 3.3.2:刷新查询时无法更改此状态。使用 call_deferred() 或 set_deferred() 来改变监控状态(错误)
- php - 未捕获的 ArgumentCountError:在旧 WP 主题中功能太少的参数
- php - 如何将公式存储在表格中并用作 php 变量进行数学运算?