为啥具有负索引的数组有效? [复制]

Posted

技术标签:

【中文标题】为啥具有负索引的数组有效? [复制]【英文标题】:Why do arrays with negative indexes work? [duplicate]为什么具有负索引的数组有效? [复制] 【发布时间】:2012-09-18 23:17:21 【问题描述】:

可能重复:Negative array indexes in C?

如何编译并按预期运行?我糊涂了。我只是好奇会发生什么,令我惊讶。有效。

#include <stdio.h>
#include <conio.h>
int main(void)

    int i;
    int array[5];
    for(i = -1; i > -6; i--)
        array[i] = i*-1;
    for(i = -1; i > -6; i--)
        printf("%d\n",array[i]);
    getch();

【问题讨论】:

考虑i[array] 的工作原理。 【参考方案1】:

它起作用了,因为你不走运。不确定应该发生什么。

array[x] 

等价于

*(array+x)

所以你基本上是在取消引用 xarray 之后位置的指针。在您的情况下,x 是负数,因此您在数组之前访问内存。不保证有效。

它编译的事实是自然的,它是有效的语法,它是一个格式良好的程序。编译器不需要生成任何诊断信息(但它可以)。

【讨论】:

【参考方案2】:

C 不为数组提供任何边界检查。因此,您只需写入内存并稍后读取即可。由于这部分内存在这段时间内没有被触及,因此您找到了预期值。

【讨论】:

【参考方案3】:

它有效,但这只是运气。

数组是一个指针,当你声明它时,它会分配一些内存(例如从位置 1 到位置 6)。然后数组指向第一个元素。当您增加索引时,ti 会将指针向前移动。

在您的情况下,您将指针移到了错误的一侧。但是C根本不关心它,而是将它的数据写入那个内存块。然后它就能够检索该数据。

要小心,因为当您从未为程序分配的内存块中读取数据时,一切都可能发生。这并不意味着会发生错误的事情,但它可以。所以,避免它。

将其视为犯罪。这并不意味着你会被逮捕,但这是有风险的。

【讨论】:

以上是关于为啥具有负索引的数组有效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥数组的索引/列表不以 1 开头? [复制]

为啥我不能索引mysql返回的数组? [复制]

为啥python的列表切片不会产生索引越界错误? [复制]

为啥我的输入被插入到两个具有相同索引的 diff 数组中? (js)

Perl 中的数组和负索引

是否可以使用负索引访问二维数组?