【问题标题】: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] 的工作原理。

标签: c arrays indexing semantics


【解决方案1】:

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

array[x] 

等价于

*(array+x)

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      它有效,但这只是运气。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-03-21
        • 2022-12-23
        • 2016-01-22
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多