0%

【C/C++】数组越界

在上篇文章《内存对齐》中说到了内存问题,今天我也遇到了可以用内存映射来解释的问题: 数组越界访问,出现死循环。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>

using namespace std;

void main()
{
int i;
int a[5];
// int i;
cout<<&i<<endl;

for(i=0;i<=5;i++)
{
a[i]=0;
cout<<a[i]<<endl;
}

}

上面的程序中,发生了数组越界访问,那么将会发生什么情况呢?一般来说的话,会系统中断,出现提示框,然而,这里发生了死循环。

我首先用下面的程序查看了 $i$ 和数组元素的地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>

using namespace std;

void main()
{
int i;
int a[5];
cout<<&i<<endl;

for(i=0;i<5;i++)
{
a[i]=0;
cout<<&a[i]<<endl;
}

}

在我的电脑(小端模式)下结果如下:

i的地址为: 12FF44
a[0]的地址为: 12FF30
a[1]的地址为: 12FF34
a[2]的地址为: 12FF38
a[3]的地址为: 12FF3C
a[4]的地址为: 12FF40

按照这种内存存储方式,a[5]的地址为: 12FF44 与 $i$ 的地址相同!又因为我令a[i]=0, 则每当循环到a[5]=0时,$i=0$, 从而满足了循环条件,陷入了死循环。

当我把变量定义顺序改变时,将i在数组后定义即:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>

using namespace std;

void main()
{
int a[5];
int i;
cout<<&i<<endl;

for(i=0;i<5;i++)
{
a[i]=0;
cout<<&a[i]<<endl;
}

}

输出的地址为:

i的地址为: 12FF30
a[0]的地址为: 12FF34
a[1]的地址为: 12FF38
a[2]的地址为: 12FF3c
a[3]的地址为: 12FF40
a[4]的地址为: 12FF44

这时若发生越界的话,a[5]的地址为: 12FF48 与$i$ 的地址不同,系统会中断,出现错误提示框

坚持原创技术分享,您的支持将鼓励我继续创作!