C语言基本语法知识(十四)数组越界与内存溢出

您所在的位置:网站首页 三星note4参数配置 C语言基本语法知识(十四)数组越界与内存溢出

C语言基本语法知识(十四)数组越界与内存溢出

2024-05-10 19:08| 来源: 网络整理| 查看: 265

一、数组下标越界简介

1、什么是数组访问越界?

在C语言中,我们可以直接通过数组下标来访问数组中的元素;

如果一个数组定义为有n个元素,那么,对这n个元素(下标为0 到 n-1的元素)的访问都合法,如果对这n个元素之外的访问,就是非法的,称为越界,例如:

int a[5] = {0}; //等价 int a[5] = {0,0,0,0,0}; a[0] = 1; // ok a[1] = 2; // ok a[2] = 3; // ok a[3] = 4; // ok a[4] = 5; // ok a[5] = 6; // 数组下标越界

在上面代码中,声明一个数组a[5],该数组中只能存放5个元素,下标索引值取值范围0~4,超过这个范围就属于下标越界;

2、访问越界会出现什么结果?

首先,它并不会 造成编译错误!就是说,C,C++ 的编译器并不判断和指出你的代码访问越界了。一个明明是错误的东西,就这样“顺利”地通过了编译;

数组访问越界在运行时,它的表现是不定的,有时似乎什么事也没有,程序一直运行(当然,某些错误结果已造成);有时,则是程序一下子崩溃。因此在使用数组时,一定要在编程中判断是否越界以保证程序的正确性。

二、数组下标越界案例#include int main() { int i, a[10]; for(i = 1; i

运行结果为

在C语言中unsigned char无符号字符类型取值范围是0~255,很明显a[2] = 400,超出取值范围,内存溢出!为什么a[2] = 144?

当如果 unsigned char 变量超过 255之 后,默认又继续重 0 开始计算,例如:int 类型 和 "https://whttp://ww.codersrc.com/archives/7815.html">unsigned char类型转换:

int类型 和 unsigned char类型转换 int unsigned char 254 254 255 255 256 0 257 1 258 2 ... ... 399 143 400 144 // 400 - 255 = 144

在取值 0~255 的时候,int 和当如果 unsigned char 一样,当超出 255 之后,当如果 unsigned char 继续重 0 开始。

六、数组下标越界和内存溢出简介

溢出本义是算术溢出(arithmetic overflow),指算术计算结果无法在一定范围内表示,细分上溢(overflow)和下溢(underflow)。

越界即访问越界(access out of range),指对存储的访问不在预先指定的界限内。逻辑上来说可能造成访问越界的计算结果也可以看成一种溢出,这是引申义。只不过两种情况经常一起出现,所以混用了。

七、数组下标越界和内存溢出区别

1、溢出是把大的东西往小的东西里装造成的,会造成程序逻辑异常,但一般不会abort。

比如一个计时器,最大计 100s 的时,你让他跑了120秒,它就溢出了。

比如一个两个 char ,一个 200 ,一个也是 200 ,相加,结果也就溢出,因为 char 最大就 255.

2、越界是访问或者使用到不属于它的地方,会造成 abort ,甚至死机。

比如,C语言数组int a[3],明明只有 3 个元素,你用 a[3],这就越界了;

比如你申请了 100 字节的内存,但你写的时候写到 101 字节去了,这也就是越界。

欢迎大家来我们交流群一起讨论学习哦。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3