c - 访问负索引处的数组元素

标签 c arrays

我有这个功能:

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/

相关文章:

c - _beginthreadex() 返回有效句柄,并在使用 Codeblocks/Mingw 和 GNU GCC 编译器执行线程时崩溃

c - 理解下面一行

c - 在 SDL 中使用 gimp 导出的 .c/.h 图像

arrays - 如何仅使用 Bash 数组反向打印目录的内容?

CS50: pset2/initials:- 我有有效的代码,但我觉得我在设置数组大小方面采取了捷径

javascript - D3 : How do I parse a CSV string into an object where keys are column names and values are arrays of data?

c - 如何处理条件初始化,这是一种好的做法吗?

c - 未定义的数组成员不为零! (C)

python - 在结构化数组中查找 header 名称的一部分的 header 索引

java - 数组 : if (data[a]. 的增强循环包含 ("word")) 问题:类型不兼容