首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么带有负索引的数组可以工作?

为什么带有负索引的数组可以工作?
EN

Stack Overflow用户
提问于 2012-09-27 08:11:47
回答 3查看 527关注 0票数 2

可能重复: Negative array indexes in C?

这是如何编译和运行的呢?我很困惑。我只是好奇会发生什么,这让我大吃一惊。啊,真灵。

代码语言:javascript
复制
#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();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-27 08:16:56

很管用,但这只是运气。

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

在你的例子中,你把指针移到了错误的一边。但是C一点也不关心它,并且把它的数据写在那个内存块上。然后它就能检索到这些数据。

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

把它想成是犯罪。这并不意味着你会被逮捕,但这有风险。

票数 2
EN

Stack Overflow用户

发布于 2012-09-27 08:14:28

因为你运气不好。应该发生什么还不清楚。

代码语言:javascript
复制
array[x] 

等于

代码语言:javascript
复制
*(array+x)

因此,您基本上是在取消引用一个指针,即xarray之后的位置。在您的例子中,x是负的,所以在数组之前访问内存。这不一定能起作用。

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

票数 6
EN

Stack Overflow用户

发布于 2012-09-27 08:15:01

C不为数组提供任何边界检查。所以你只需把它写进内存,稍后再读。由于内存的这一部分在这段时间内没有被触及,所以您可以找到预期的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12616830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档