2

我有类似于下面的代码。

    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 上交叉编译代码。

4

1 回答 1

4

现在,由于我们正在访问堆栈之外的内存位置,我会假设系统会出现故障,但事实并非如此。

在堆栈上分配的内存范围之外写入是未定义的行为。调用这种未定义的行为通常(但不总是)会导致段错误。但是,您不能确定是否会发生段错误。

维基百科链接很好地解释了它:

当发生未定义行为的实例时,就语言规范而言,任何事情都可能发生,也许什么都不会发生。

因此,在这种情况下,您可能会遇到段错误,程序可能会中止,或者有时它可能运行良好。或者,任何东西。没有办法保证结果。

我想知道一个方向,我可以看看它是如何工作的。

我不确定你在这里问什么。你能澄清一下你所说的“工作”是什么意思吗?你想让这个程序做什么?

于 2013-09-08T08:10:56.513 回答