3

我有一个用 C 语言编写并用 GCC 编译器编译的 ATmega 代码。

一些数据需要存储在 EEPROM 中,所以我添加了这些声明:

在此处输入图像描述

在我阅读 EEPROM 后,我发现数据以某种奇怪的方式放置。经过一番调查,我在 .map 文件(工具链产生的众多文件之一)中发现了这个文本:

在此处输入图像描述

如您所见,编译器以相反的顺序放置数据。

当然,我可以反向声明并享受进一步的编码,但这是出乎意料的,所以我害怕面对任何其他意想不到的行为,直到我不明白编译器为什么这样做。

有什么想法吗?

4

1 回答 1

2

正如@Lundin 所说,全局变量不需要连续分配。

您可以使用struct其成员始终按照指定的相同顺序分配的特性。
根据 C11 标准,§6.7.2.1.15:

在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增

不过要注意padding

于 2015-12-22T07:34:14.063 回答