【C/C++】数组越界

简介: 在上篇中说到了内存问题,今天我也遇到了可以用内存映射来解释的问题。代码如下: #includeusing namespace std;void main(){ int i; int a[5];// int i; ...

在上篇中说到了内存问题,今天我也遇到了可以用内存映射来解释的问题。代码如下:

#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和数组元素的地址:

#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在数组后定义即:

#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的地址不同,系统会中断,出现错误提示框


目录
相关文章
|
2月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
74 4
|
6月前
|
存储 C++
C++指针数组
C++指针数组
43 1
|
6月前
|
存储 C++
C++程序数组与指针:深入理解与实践
C++程序数组与指针:深入理解与实践
65 1
|
2月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
3月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
41 4
|
3月前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
100 0
|
4月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
29 6
|
4月前
|
存储 安全 C++
开发与运维数组问题之声明一个数组如何解决
开发与运维数组问题之声明一个数组如何解决
43 6
|
4月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
52 5
|
3月前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组