我有这个功能:
void func(int index, struct foo b[])
{
// ...
a[0][0] = b[index].c[0];
// ...
}
但有时会使用索引-2
调用该函数:
a[0][0] = b[-2].c[0];
我认为 -2 超出范围,有时会崩溃,但有时不会。
如果数组b的头地址是0xffd9cda4,那么b[-2]的地址是多少?
0xffd9cda4 + 0xfffffffe = 0x1ffd9cda2? 0x1ffd9cda2 有效吗?
它在 Linux 64 位上运行。
最佳答案
访问超出其范围的数组会导致未定义的行为。但是,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
的数组边界。
关于c - 访问负索引处的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033398/