如果它有m个元素,我们可以访问m th 数组元素吗? 我的意思是,如果数组有7个元素,是否有可能在数组[7]中存储任何值? 但是当长度为7时,数组索引从0开始并以6结束。
答案 0 :(得分:5)
不,访问数组绑定之外的元素是未定义的行为。获取超出最后一个数组元素的元素1的地址是明确定义的。
要了解其含义,请考虑阅读How dangerous is it to access an array out of bounds?
答案 1 :(得分:3)
你回答自己的问题 -
是否有可能在数组[7]中存储任何值?但是当长度为7时,数组索引从0开始并以6结束
如您所见,对于长度为7
的数组,可能的索引是从0
到6
。数组在堆栈上分配了大量内存。如果您尝试访问array[7]
,那么您将访问未经初始化且未经授权的阵列的内存,并将导致未定义的行为。
答案 2 :(得分:3)
不,您只能访问索引从0
到size-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+0
和foo+1
之间,第二个元素位于foo+1,
和foo+2
之间,第三个元素位于foo+2
和foo+3
之间,以及foo+3
和foo+4
之间的第四个。地址foo+4
是一个非常精细的地址,但第四个元素紧接在之前(同样第一个元素紧接在foo+1
之前,第二个元素在foo+2
之前,和foo+3
之前的第三个。
大多数代码通过其起始地址来标识元素,但有时使代码在紧跟在指针之前的元素上运行可能是有用的。例如,如果软件堆栈指针指向应该写入项目的下一个位置,则弹出堆栈应该返回之前的项目该指针给出的地址。如果堆栈使用字节大小的对象并初始化为foo
,则在按下四个单字节项后,指针将等于foo+4
,表示要弹出的下一个项应该是第四个。