-2

我有这个功能:

void func(int index, struct foo b[])
{
    // ...
    a[0][0] = b[index].c[0];
    // ...
}

但有时使用 index 调用该函数-2

a[0][0] = b[-2].c[0];

我认为 -2 超出范围,有时会崩溃,但有时不会。

如果数组b的头地址是0xffd9cda4,那么b[-2]的地址是什么?
0xffd9cda4 + 0xffffffffe = 0x1ffd9cda2?0x1ffd9cda2 有效吗?

它在 64 位 Linux 上运行。

4

3 回答 3

2

您有一个数组b,它占用从 address 开始的内存块&b[0]。甚至不要试图找出 的地址是什么b[-2],因为这显然不在这个数组占用的内存块内。

试图访问数组边界外的内存会产生未定义的行为


另请注意,无法b在此函数的主体中检索数组的大小:

void func(int index, struct foo b[]) {
    // ...
}
于 2013-02-22T21:31:13.393 回答
2

访问超出其边界的数组会导致未定义的行为。但是,C 没有自动数组边界检查。所以这可能会导致崩溃,但不能保证它会。通常它只是溢出到恰好位于内存中相邻的某个对象中。

请注意,如果b是指针,而不是数组,则b[-2]可能是有效的。例如

typedef struct foo {
   int c[5];
} foo_struct;
foo_struct x[10];
foo_struct *b = &x[3];

如果你现在这样做:

a[0][0] = b[-2].c[0];

这相当于做:

a[0][0] = x[1].c[0];

在这种情况下,相关的数组边界是x.

于 2013-02-22T21:53:33.420 回答
0
b[-2]

是相同的

*(b - 2)

这显然是错误的。未定义的行为,访问您不拥有的内存。UB 并不意味着你的程序会崩溃,它意味着你的程序的行为是 undefined

于 2013-02-22T21:45:52.530 回答