42.C语言 数组内存溢出

最后更新于:2020-08-22 23:21:05

一.数组内存溢出简介

溢出:想象一个桶,桶的容积是有限的,你装满了水以后,如何还要往里面装,那么水就溢出到地面了。

C语言中的溢出和这个原理一样,桶的容积就表示你定义的某一数据的内存大小,往里面写入数据就表示在装水。

案例一:一个计时器,最大计100s的时,你让他跑了120秒,它就溢出了;

案例二:两个unsigned char,一个200,一个也是200,相加,结果也就溢出,因为unsigned char最大就255;

二.数组内存溢出实例

/************************************************************************/
/*@文件名      : C/C++ 数组内存溢出.cpp                                                       
/*@日  期      : 2020/5/29 19:37
/*@作  者      : 猿说编程 
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C/C++教程 - 数组内存溢出 
/************************************************************************/

#include<stdlib.h>
#include<stdio.h>


void main()
{
    unsigned char a[3] = {0};
    a[0] = 200;
    a[1] = 200;
    a[2] = a[0] + a[1]; //unsigned char 取值范围:0~255 ,超出取值范围
    printf("a:%d  b:%d c:%d\n", a[0], a[1], a[2]);

    system("pause");
}

/*
输出:
a:200  b:200 c:144
请按任意键继续. . .
*/

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

当如果unsigned char变量超过255之后,默认又继续重0开始计算,例如:int类型 和 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开始;


猜你喜欢

1. 三目运算符

2. 逗号表达式

3. NaN(Not a Number)

4. memcpy/strcpy/strcpy_s 区别

5. unicode 和多字节区别

6. 数组定义和使用

7. sizeof和strlen函数区别

8. Debug和_DEBUG区别

9. _WIN32/WIN32/_WIN64/WIN64区别

10. 判断exe可执行程序是32位的还是64位

11. 十进制和二进制相互转换

12. 十进制和八进制相互转换

13. 十进制和十六进制相互转换

14. 数组下标越界




转载请注明: 猿说编程 » C/C++教程 » 数组内存溢出

赞赏

微信赞赏支付宝赞赏