我正在为一个类编写一些代码,我需要操作一些用户输入。输入是一个用户字符串,其中包含内存地址的十六进制值和最长为16个字符的单词/短语。然后,将内存地址之后的每个字符转换为十六进制值,然后使用该值在指定的内存地址处设置字节值。
Cmd *new_cp = &cmds[1];
int memAddrs_int = 0;
char userString [16] = "";
char memAddrs_str [16] = "";
char argsToPass [16] = "";
char byteValue [2] = "";
这段代码可以在Linux环境中很好地复制和运行,但是当我在模拟嵌入式系统的VM中运行它时,我得到了一个页面错误异常。在重命名一些变量时,我将数组的顺序更改为:
Cmd *new_cp = &cmds[1];
int memAddrs_int = 0;
char userString [16] = "";
char argsToPass [16] = "";
char memAddrs_str [16] = "";
char byteValue [2] = "";
现在一切都按预期进行了。为什么声明和初始化数组的顺序在嵌入式系统中很重要?或者,这是否与它在VM上运行这一事实有关?
2条答案
按热度按时间qojgxg4l1#
在这里,声明的顺序不是因果关系。相反,其他地方的一些内存访问错误具有不同的影响,因为声明顺序会影响正在被破坏的相邻数据对象以及后来访问和使用的数据对象。
在代码中的某个地方,您有一个带有“未定义行为”结果的错误,任何更改,包括不相关数据对象的声明顺序,都会影响“实际行为”。这种行为甚至可以自发地改变,而不会改变。
py49o6xq2#
你有
如果
byteValue
数组打算保存像"3d"
这样的字符串(正如您在注解中确认的那样),则需要使用三个元素声明它,其中一个元素用于必要的空终止符:当它被声明为大小为2时,当一些代码在那里写入三个字节并溢出它时,其他一些内存片段被覆盖。我们不知道这是哪一段记忆,也不知道影响是什么--是良性的还是灾难性的,或者介于两者之间--但改变声明的顺序改变了情况也就不足为奇了。