【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++ 那些你一定出错的数组笔试题
22 0
|
5月前
|
存储 编译器 Linux
危险的指针---字符指针和字符数组指针所导致的段错误
危险的指针---字符指针和字符数组指针所导致的段错误
58 0
|
5月前
指针-实现数组循环移动
指针-实现数组循环移动
|
5月前
数组越界死循环问题!
数组越界死循环问题!
22 0
|
5月前
|
Java 索引 容器
【JavaSE专栏28】数组下标能越界?越界了如何处理?
【JavaSE专栏28】数组下标能越界?越界了如何处理?
149 0
|
5月前
|
编译器 C语言 C++
数组越界访问打印后为什么会陷入死循环
数组越界访问打印后为什么会陷入死循环
54 0
|
6月前
|
编译器 C语言 C++
C语言数组越界造成的死循环例子,当你得到了这个意想不到的结果的时候,你肯定不知道为什么,看你还敢不敢越界访问数组了
C语言数组越界造成的死循环例子,当你得到了这个意想不到的结果的时候,你肯定不知道为什么,看你还敢不敢越界访问数组了
|
7月前
有关动态内存分配的错误使用和题目(详解)
动态内存分配(有关动态内存分配的题目和常见的错误) 一、首先我们先看一下(常见的动态内存的错误) 1.直接对NULL的解引用操作 2.对动态开辟的内存的越界访问 3.对非动态开辟内存使用free释放 4.使用free释放一块动态内存开辟内存的一部分 5.对同一块动态内存的多次释放 6.动态开辟内存忘记释放(导致内存的泄露) 二、接下来我们介绍一下几个经典的有关动态内存开辟的题目(详解坑人处) 第一题: 第二题: 第三题: 第四题: 三、所以我们这边再用一幅图来理解一下什么是内存空间 四、总结:动态内存的使用真的非常的重要,所以各位小伙伴们一定要熟练掌握哦!
|
12月前
|
程序员 编译器 C语言
C语言常见问题之数组越界与溢出
C语言常见问题之数组越界与溢出
241 0
C语言常见问题之数组越界与溢出