我有一个使用C语言编写、使用GCC编译器编译的ATmega代码。 需要将一些数据存储在EEPROM中,因此我添加了以下声明: 在读取EEPROM后,我发现数据以某种奇怪的方式存放。经过一些调查,我在 .map 文件(由工具链生成的众多文件之一)中找到了这段文本: 如您所见,编译器将数据以相反的顺序放置。当然,我可以颠倒声明并继续编码,但这是意料之外的事情,因此在我不理解编译器为什么这样做之前,我害怕面对任何其他意外行为。有什么想法吗?
正如@Lundin所述,全局变量不需要连续分配。您可以使用struct的特性,其成员总是按照指定顺序分配。从C11标准,§6.7.2.1.15: 在结构对象内,非位字段成员和位字段所在的单元具有按照它们声明的顺序增加的地址。 但要注意填充!
#pragma
或 "__declspec" 或其他名称。 - LundinEEMEM
对象在内存中的顺序与它们在声明中出现的顺序。正如其他人所说,您不能假设任何顺序。 - ouah