我的代码类似于以下内容。
int foo (unsigned int a)
{
struct tid{
int id;
char abd[8];
};
int ret = 0;
struct tid arr[256];
ret = arr[a];
...
}
传递给foo的值是0xFFFFFFFF。现在,由于我们正在访问堆栈外部的内存位置,我认为系统会出错,但事实并非如此。 我想知道一个方向,我可以看看它是如何工作的。 正在考虑的机器是MIPS 4K,具有32位寻址和256 MB RAM。我正在使用gcc在x86 PC上交叉编译代码。
答案 0 :(得分:4)
现在,由于我们正在访问堆栈外部的内存位置,我认为系统会出错,但事实并非如此。
在堆栈上分配的内存范围之外写入undefined behaviour。通常(但不总是)调用此未定义的行为会导致段错误。 但是,你不能确定会发生段错误。
维基百科链接很好地解释了它:
当出现未定义行为的实例时,就语言规范而言,任何事情都可能发生,也许什么都没发生。
因此,在这种情况下,您可能会遇到段错误,程序可能会中止,或者有时可能会运行正常。或者,任何事情。没有办法保证结果。
我想知道一个方向,我可以看看它是如何工作的。
我不确定你在这里问的是什么。你能澄清“工作”的意思吗?你想要这个程序做什么?