本节要点
1,数组越界写入可能会改变其他变量的值
2,数组越界访问可能会导致程序崩溃
在函数中使用数组是指在栈空间上申请内存,如果数组越界可能会访问到别的变量上。
我们做一个例子来试试改变别的变量的值。我们先看看内存和变量的地址分布。
int n_var1 = 100;
int n_array_A[4] = {0,1,2,3};
int n_array_B[4] = {0,1,2,3};
int n_var2 = 200;
int n_var3 = 300;
for(auto& nvalue : n_array_A){
cout << "n_array_A:" << &nvalue << "," <<endl;
}
for(auto& nvalue : n_array_B){
cout << "n_array_B:" << &nvalue << "," <<endl;
}
cout << "n_var1:"<< &n_var1 << endl;
cout << "n_var2:"<< &n_var2 << endl;
cout << "n_var3:"<< &n_var3 << endl;
cout << "n_array_A:";
for(auto& nvalue : n_array_A){
cout << nvalue << "," ;
}
cout << endl;
cout << "n_array_B:";
for(auto& nvalue : n_array_B){
cout << nvalue << "," ;
}
cout << endl;
cout << "n_var1:" << n_var1 << " n_var2:" << n_var2 << " n_var3:" << n_var3 << endl;
执行结果:
n_array_A:0xffffcb00,
n_array_A:0xffffcb04,
n_array_A:0xffffcb08,
n_array_A:0xffffcb0c,
n_array_B:0xffffcb10,
n_array_B:0xffffcb14,
n_array_B:0xffffcb18,
n_array_B:0xffffcb1c,
n_var1:0xffffcaf4
n_var2:0xffffcaf8
n_var3:0xffffcafc
n_array_A:0,1,2,3,
n_array_B:0,1,2,3,
n_var1:100 n_var2:200 n_var3:300
通过地址我们可以分析出,n_array_A的最后一个元素与n_array_B的第一个元素是相邻的。
也就是说我们给n_array_A[4]赋值的话可能会赋到n_array_B[0]上去。
同样我们给n_array_A[-1]赋值的话可能会赋到n_var3上去。
我们修改一下代码试试:
int n_var1 = 100;
int n_array_A[4] = {0,1,2,3};
int n_array_B[4] = {0,1,2,3};
int n_var2 = 200;
int n_var3 = 300;
for(auto& nvalue : n_array_A){
cout << "n_array_A:" << &nvalue << "," <<endl;
}
for(auto& nvalue : n_array_B){
cout << "n_array_B:" << &nvalue << "," <<endl;
}
cout << "n_var1:"<< &n_var1 << endl;
cout << "n_var2:"<< &n_var2 << endl;
cout << "n_var3:"<< &n_var3 << endl;
n_array_A[4] = 999;
n_array_A[-1] = 1111;
cout << "n_array_A:";
for(auto& nvalue : n_array_A){
cout << nvalue << "," ;
}
cout << endl;
cout << "n_array_B:";
for(auto& nvalue : n_array_B){
cout << nvalue << "," ;
}
cout << endl;
cout << "n_var1:" << n_var1 << " n_var2:" << n_var2 << " n_var3:" << n_var3 << endl;
执行结果:
n_array_A:0xffffcb00,
n_array_A:0xffffcb04,
n_array_A:0xffffcb08,
n_array_A:0xffffcb0c,
n_array_B:0xffffcb10,
n_array_B:0xffffcb14,
n_array_B:0xffffcb18,
n_array_B:0xffffcb1c,
n_var1:0xffffcaf4
n_var2:0xffffcaf8
n_var3:0xffffcafc
n_array_A:0,1,2,3,
n_array_B:999,1,2,3,
n_var1:100 n_var2:200 n_var3:1111
结果和我们预想的一样n_array_B[0]和n_var3的值都被改变了。
这说明了【1,数组越界写入可能会改变其他变量的值】。
关于【2,数组越界访问可能会导致程序崩溃】的说明就更简单一些
只要把n_array_A[4]的4改得更大一些,比如9999.就会受到函数执行的栈空间异常。
0 [main] cpp11test 15848 cygwin_exception::open_stackdumpfile: Dumping stack trace to cpp11test.exe.stackdump