是否可以访问自己大小的数组元素?

时间:2016-06-22 05:02:31

标签: c arrays

如果它有m个元素,我们可以访问m th 数组元素吗? 我的意思是,如果数组有7个元素,是否有可能在数组[7]中存储任何值? 但是当长度为7时,数组索引从0开始并以6结束。

5 个答案:

答案 0 :(得分:5)

不,访问数组绑定之外的元素是未定义的行为。获取超出最后一个数组元素的元素1的地址是明确定义的。

要了解其含义,请考虑阅读How dangerous is it to access an array out of bounds?

答案 1 :(得分:3)

你回答自己的问题 -

  

是否有可能在数组[7]中存储任何值?但是当长度为7时,数组索引从0开始并以6结束

如您所见,对于长度为7的数组,可能的索引是从06。数组在堆栈上分配了大量内存。如果您尝试访问array[7],那么您将访问未经初始化且未经授权的阵列的内存,并将导致未定义的行为

答案 2 :(得分:3)

不,您只能访问索引从0size-1的元素。超出该范围的任何内容都会导致未定义的行为。如果索引接近范围,很可能您会读取自己程序的内存。如果索引大部分超出范围,很可能你的程序将被操作系统杀死。

答案 3 :(得分:1)

永远不要尝试访问越界数组元素。它有不确定的行为。

但是,如果你是一个该死的疯子,你可以尝试这样的事情:

int ar[7];
int tmp = ar[7];
ar[7] = 8;
std::cout << ar[7] << std::endl; // the output is 8, as you can guess
ar[7] = tmp;

如果您幸运,这不会导致任何错误,因为您将ar[7]的初始值恢复了。如果不这样做,MSVS会在函数结束时生成运行时错误,并显示以下消息:

变量'ar'周围的堆栈已损坏

不知道其他编译器。

答案 4 :(得分:0)

给定char foo[4],内存将按如下方式分配:

foo+0  foo+1  foo+2  foo+3  foo+4
  |      |      |      |      |
  |first |second|third |fourth|

第一个元素位于foo+0foo+1之间,第二个元素位于foo+1,foo+2之间,第三个元素位于foo+2foo+3之间,以及foo+3foo+4之间的第四个。地址foo+4是一个非常精细的地址,但第四个元素紧接在之前(同样第一个元素紧接在foo+1之前,第二个元素在foo+2之前,和foo+3之前的第三个。

大多数代码通过其起始地址来标识元素,但有时使代码在紧跟在指针之前的元素上运行可能是有用的。例如,如果软件堆栈指针指向应该写入项目的下一个位置,则弹出堆栈应该返回之前的项目该指针给出的地址。如果堆栈使用字节大小的对象并初始化为foo,则在按下四个单字节项后,指针将等于foo+4,表示要弹出的下一个项应该是第四个。