c-为什么结构内存用随机字符初始化?(嵌入式)



将MCUXpresso与NXP MKL02Z16VFM4结合使用以供参考。

当我声明这样的结构时

typedef struct {
uint8_t DATA :8;
} myStruct;
myStruct xxx __attribute__ ((section ("xyz")));

存储器中的位置用随机字符填充。处理器是小端序,所以当我试图访问这个地址时,我会得到那些随机字符和我写入结构的数据。

//At address 0x1FFFFE84 : BD84D1E4
xxx.DATA = 0xAA; //Assign some numbers to struct
//Now, 0x1FFFFE84 : BD84D1AA

我可以使用memset来清除内存,但我想知道为什么在声明结构时内存中会填充这些随机字符。

您已经在xyz节中明确定位了xxx-编译器和默认启动代码不知道该节,因此不需要像默认的bss段那样明确零初始化。对于大多数易失性内存技术,内存在通电时具有不确定性的内容-因此在这种情况下显然是随机的。

如果您希望私有部分的初始化为零,则需要在链接器脚本和/或启动代码中明确添加。然而,围绕结构的未使用内存的内容或其中的任何对齐填充都是不相关的,并且显式地将其清除为某个已知值在很大程度上是不必要的。

结构变量,但实际上是ANY变量,在代码中使用之前需要初始化。访问(读取(未初始化的数据会导致未定义的行为,这意味着编译器无法以可预测的方式运行。

大多数编译器都设置为0未初始化的变量,但其他一些编译器(例如,一些嵌入式编译器(没有。这就是为什么你会看到随机值。

最新更新