数组(2)-数组越界



本节要点

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值