c++数组越界

调试程序的时候遇到了一个数组越界的问题:定义了一个4x9的数组axis[4][9],使用这个数组时,如果是axis[4][x]这样用的话,则会报错,读取了错误的内存;但是如果axis[5][x]、axis[6][x]、axis[7][x]这样用又没有报错,可以正常使用,不明白是为什么?

这同编译器有关。
对c / c++ 而言,方括号 是特殊的运算符,非标点符号。
例如: x[i] 等于 *(x+i); 也等于 i[x]; (很奇怪,但100%正确)
你试验一下程序:
int x[3]={1,2,3};
printf("x:\n");
for (i=0;i<3;i++) printf("%d ", i[x]); (很奇怪,但100%正确)
axis[4][x] 在c / c++ 就是: *(*(axis+4)+x)
同样: axis[5][x]、axis[6][x]、可以正常使用,但很可能有运行时的错误发生,程序垮掉。
看程序:
#include <stdio.h>
int main(){
float axis[4][9];
int i,j,v=1,x;
for (j=0;j<4;j++) for (i=0;i<9;i++) *(*(axis+j)+i) = v++; //正确
for (j=0;j<4;j++) {
for (i=0;i<9;i++) printf("%2.0f ",axis[j][i]); //正确
printf("\n");
}
printf("\n");
for (x=0;x<9;x++) axis[4][x]=v++;
printf("\n");
for (x=0;x<9;x++) printf("%2.0f ",*(*(axis+4)+x));
printf("\n");
return 0;
}
程序垮掉 是 地址运算溢出引起,就如普通程序,编译通过,计算溢出一样。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-01-02
定义数组a[x],仅可使用0至x-1内的位置,使用其它均为错误。至于是否报错与储存地址状态等因素有关。
相似回答