精华内容
下载资源
问答
  • c语言数组下标越界
    2021-08-20 09:38:23

    目录

    零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

    一.数组下标越界和内存溢出简介

    **溢出本义是算术溢出(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 字节去了,这也就是越界。

    三.猜你喜欢

    1. 安装 Visual Studio
    2. 安装 Visual Studio 插件 Visual Assist
    3. Visual Studio 2008 卸载
    4. Visual Studio 2003/2015 卸载
    5. C 语言格式控制符/占位符
    6. C 语言逻辑运算符
    7. C 语言三目运算符
    8. C 语言逗号表达式
    9. C 语言 sizeof 和 strlen 函数区别
    10. C 语言 strcpy 和 strcpy_s 函数区别
    11. C 语言 memcpy 和 memcpy_s 区别
    12. C 语言 数组定义和使用
    13. C 语言 数组遍历
    14. C 语言 数组排序 – 冒泡法排序
    15. C 语言 数组排序 – 选择法排序
    16. C 语言 数组排序 – 插入法排序
    17. C 语言 数组排序 – 快速法排序
    18. C 语言 数组下标越界
    19. C 语言 数组内存溢出
    20. C 语言 数组下标越界和内存溢出区别

    未经允许不得转载:猿说编程 » C 语言 数组下标越界和内存溢出区别

    更多相关内容
  • 数组下标越界简介 1、什么是数组访问越界? 2、访问越界会出现什么结果? 二.数组下标越界案例 三.防止数组下标越界方法 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一...

    目录

    零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

    一.数组下标越界简介

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

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

    如果一个数组定义为有n个元素,那么,对这n个元素(下标为0n-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++ 的编译器并不判断和指出你的代码访问越界了。一个明明是错误的东西,就这样“顺利”地通过了编译;

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

    二.数组下标越界案例

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 数组下标越界
    //@Time:2021/06/10 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    
    
    #include <stdio.h>
    int main()
    {
        int i, a[10];
        for(i = 1; i <= 10; ++i)
            a[i] = 0;
        return 0;
    }
    

    数组中的下标从 0 开始,那么在上面代码中只能访问:a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9];i自加到10时,a[10]属于数组下标越界。

    三.防止数组下标越界方法

    如果数组的长度和下标访问值弄错,都会造成数组下标越界;数组的下标是从 0 开始的,最大的访问值是数组的长度-1;

    //如果是整形数组
    int len = sizeof(array)/sizeof(int);
    //如果是字符数组
    int len = sizeof(array)/sizeof(char);
    //如果是浮点数数组
    int len = sizeof(array)/sizeof(double);
    //如果是浮点数数组
    int len = sizeof(array)/sizeof(float);
    for(int i = 0;i < len ; i++)
    {
        //.....
    }
    

    四.猜你喜欢

    1. 安装 Visual Studio
    2. 安装 Visual Studio 插件 Visual Assist
    3. Visual Studio 2008 卸载
    4. Visual Studio 2003/2015 卸载
    5. C 语言格式控制符/占位符
    6. C 语言逻辑运算符
    7. C 语言三目运算符
    8. C 语言逗号表达式
    9. C 语言 sizeof 和 strlen 函数区别
    10. C 语言 strcpy 和 strcpy_s 函数区别
    11. C 语言 memcpy 和 memcpy_s 区别
    12. C 语言 数组定义和使用
    13. C 语言 数组遍历
    14. C 语言 数组排序 – 冒泡法排序
    15. C 语言 数组排序 – 选择法排序
    16. C 语言 数组排序 – 插入法排序
    17. C 语言 数组排序 – 快速法排序
    18. C 语言 数组下标越界

    未经允许不得转载:猿说编程 » C 语言 数组下标越界

    展开全文
  • C语言数组下标越界访问引发的程序死循环

    首先来判断以下代码的执行结果

    #include <stdio.h>
    int main() {
    	int i = 0;
    	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    	for (i = 0; i <= 12; i++) {
    		arr[i] = 0;
    		printf("hehe\n");
    	}
    	return 0;
    }

    在VS2019编译环境下,这串代码的执行结果是死循环地向控制台输出hehe。相信大家会有三个疑问:

    1. 下标越界为什么不报错?
    2. 每次循环执行完都会i++,迟早会不符合循环条件,为什么会死循环?
    3. 这跟编译环境有什么联系?

    接下来我来带着大家一起来探究其中的奥秘。

    前置知识

    1. 局部变量在栈中存储,栈内存的使用习惯是先使用高地址,再使用低地址

    2. 随着数组下标的增涨,数组元素的内存地址会越来越大

    #include <stdio.h>
    int main() {
    	int i = 0;
    	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    	for (i = 0; i <= 12; i++) {
    		arr[i] = 0;
    		printf("hehe\n");
    	}
    	return 0;
    }

    分析这段代码,for循环的执行过程当中会给数组的每一个元素赋值,当循环执行到数组最后一个元素的下一个元素时,虽然发生了下标越界的现象,内存中也确确实实存在着这样一块儿空间,但是这块儿空间并不属于数组本身。

    栈内存的使用习惯是先使用高地址后使用低地址,意思就是随着内存空间的开辟,内存地址会越来越小。请看图:

    图中一个小长方形代表一个字节。在这段代码当中,先定义了 int 类型变量 i,这会在栈区中为其开辟4个字节的内存空间。又定义了 int 类型数组arr,整个数组的内存空间将会在 i 变量所在内存空间的上方。所以通过数组下标的不断增涨,内存地址会不断增大,是有可能访问到 i 变量所在的内存空间的,在 vs2019 编译环境中,会给每个变量之间留8个字节的空隙,所以循环执行到 arr[10] 的时候,访问到了 间隙1 的内存空间,当循环执行到arr[11]的时候访问到了 间隙2 的内存空间。而当循环执行到arr[12] 时,访问的正是 i 变量所对应的内存空间,此时对arr[12]进行赋值就相当于对 i 进行赋值。当 i = 12 时,就会将 i 重新打回 0 。所以始终不会满足i > 12,也就是说循环条件始终成立,这就造成了死循环的结果。

    现在来回答最开始提到的三个问题:

    1. 下标越界为什么不报错?
            因为程序一直在执行,发生了死循环,报错信息根本没机会看到。


    2. 每次循环执行完都会i++,迟早会不符合循环条件,为什么会死循环?
            当访问 arr[12] 时其实访问的是 i 变量,每当 i = 12 时都会给 i 重新赋值为 0,所以循环条件一直满足,循环会一直执行下去。

            
    3. 这跟编译环境有什么联系?
            编译环境不同,变量与变量之间的空档空间大小不同,VS2019是8个字节,其他的可能是2个字节、1个字节甚至没有空档空间。所以不同编译环境下,这段代码的执行结果可能不同。

    综上可以了解到,任何一段不符合规定的代码都有可能导致未知的结果,例如数组下标越界访问、野指针等。平时编写代码时候尽量编写符合规定的代码,规避潜在问题。

    展开全文
  • C语言数组下标越界

    2021-08-31 23:46:59
    数组越界的严重性 在 C 语言里,数组需为静态的。数组的大小需要在程序运行前就确定下来。 C语言数组越界的严重性...i自加到10时,a[10]属于数组下标越界。 详细分析图 1、栈把内存分配给数组,并且自上而下从小地址开

    数组越界的严重性

    在 C 语言里,数组需为静态的。数组的大小需要在程序运行前就确定下来。
    C语言数组越界的严重性在于对数组元素访问及修改的内容存在不确定性。
    这类没有预知性的修改会导致无法确定的错误,发生缓冲区泄露漏洞。
    这也就是数组越界的严重所在。

    代码如下所示:
    在这里插入图片描述
    数组里的下标从0开始。
    那么在上面代码只能访问:a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]
    i自加到10时,a[10]属于数组下标越界。

    详细分析图

    1、栈把内存分配给数组,并且自上而下从小地址开始分配内存,对应于数组下标:
    在这里插入图片描述
    对数组进行内存分配之后进行数组循环赋值。数组下标为0~9在数组所分配的空间内。
    在这里插入图片描述
    由顶部代码可知数组访问将会越界,如图所示访问到数组范围之后,并且对越界空间进行操作,破坏原有数据。访问之后程序会破坏内存原有数据,导致缓冲区泄露,并且发生不可预知的错误。

    展开全文
  • 点击上方蓝字关注我,了解更多咨询1、若数组长度和下标访问值出现错误,则会导致数组下标越界。数组下标从0开始,访问值为-1。2、在使用循环遍历数组元素时,注意防范off-by-one的错误。对于作为函数参数传入的数组...
  • 发现变量 i 的地址是在数组之前。 改变一下程序:先声明 i #include int main{ int i; int a[3]={1,2,3}; printf("%p %p %p %p %p\n",&a[0],&a[1],&a[2],&a[3],&i); for(i=0;i;i++){ a[i]=0; printf("%d\n",a...
  • #include<stdio.h> int main() ...在这段代码中,很明显看出是有问题的,当for循环大于9以后下标越界了,但这段代码放在vs2019中却能运行起来,这是为什么呢? 结论:因为i和arr是局部变..
  • 这两天被人问了一个问题说假如C/C++访问下表越界数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以)例:1 #...
  • 数组下标越界

    2021-05-21 04:44:51
    已结贴√问题点数:20回复次数:11 数组下标越界题目是一个有10个元素的数组,存有10个考生的分数,写5个函数,分别计算总分,最高分,最低分,平均分,分数升序排列。我写了5函数,问题出在最高分和最低分函数上。...
  • 越界了,undefined behavior。你这个代码中,都是在栈上分配的,栈是高位往低位扩张,一开始栈的布局是这样的a9a8a7a6a5a4a3a2a1a0每次loop,会在低位申请然后又释放i,栈的布局:a9a8a7a6a5a4a3a2a1a0i这种情况下...
  • 1,数组越界访问 https://blog.csdn.net/qq_41209741/article/details/80465496 2,为什么数组要从 0 开始编号,而不是从 1 开始呢? ... 3,C----数组越界问题、指针入门 ...4,自身对C语言数组越界访问的
  • 这个数组下标越界很明显,声明时明明是b[5],使用时却不能用b[5],没错,C语言就是这样设计的。 这段程序将显示一个随机值吗?错,它显示变量a的值,即6543,不是随机值。这是为什么?要从栈的结构说起。 栈是从高...
  • c语言数组下标为负数

    千次阅读 2020-07-30 09:22:18
    c语言数组的下标可以是负号,在代码运行前不会对数组是否下标越界、溢出等异常进行警告或处理,因此需人为干预。 测试代码: #include<stdio.h> #include <stdlib.h> int main(int argc, char *...
  • C语言数组是静态的,不能自动扩容,当下标小于零或大于等于数组长度时,就发生了越界(Out Of Bounds),访问到数组以外的内存。如果下标小于零,就会发生下限越界(Off Normal Lower);如果下标大于等于数组长度,...
  • 编程时我们经常会遇到处理边界问题的情况...C语言数组下标必须是从0开始的,但C语言中的指针操作给我们提供了解决负数下标问题的方法。看下面一个示例:#include "stdafx.h"#include int main(int argc, char *arg...
  • C语言数组下标-1你见过吗?

    千次阅读 2020-05-16 18:21:40
    不知道你有没有见过-1作为数组下标的,我算是见到了。当然这一点在Python之类的语言中毫不稀奇。 ​下标-1的代码 这里redis源码中的一部分: sdssdsMakeRoomFor(sdss,size_taddlen){ void*sh,*newsh; size_...
  • 数组下标越界是一个编程初学者最容易犯的错误。 以一个简单的一维数组为例: int a[10];这是一个整型的数组a,有10个元素:a[0]-a[9],因为正确的下标应该是从0开始,到9结束,与生活习惯中的1-10不一样,于是...
  • 对于数组把握和理解不深的同学·们来说,数组下标越界一直是个头疼的问题,有没有什么好的方法去检测变量什么时候会导致数组越界呢?这是这篇文章介绍的重点 assert断言函数 头文件 <assert.h>,C++中是<...
  • 数组下标越界解析(以C语言为例)

    千次阅读 2017-01-28 15:17:21
    这段时间把C++学完了顺带把C重学了一遍,有了汇编的基础后过去的很多疑惑都解开了,比如下面这道数组下标越界问题。 问题代码如下: #include  int Helloworld()  {  printf("HelloWorld");  return 0...
  • 关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误...
  • 可以看一下这个代码会出现什么问题:答案是在VS2013-VS2019中下面代码出现了程序死循环 APP 中接收数据代码: #include<stdio.h> int main(){ ...2.arr数组的存储是随着下标的增长,地址由低到高
  • 第7章 数组——一维数组下标越界问题分析C语言程序设计第7章 数组数组元素的访问访问数组元素时,下标越界是大忌!编译器通常不检查下标越界,导致程序运行时错误下标
  • 关于C++中数组下标越界不报错的问题

    千次阅读 多人点赞 2019-12-08 16:19:39
    C++中数组下标越界程序并不报错是因为编译器不会对数组下标作越界检查造成的。 C语言非常重视运行时的效率,所以没有进行数组越界检查,而C++继承了C的效率要求,自然也不做数组越界检查。(检查数据越界,编译器...
  • 一、数组赋值 数组名就代表着该数组的首地址,后面的所有元素都可以根据数组名加上偏移量取到。 1. 一维数组 第一个小例子:编程实现显示用户输入的月份(不考虑闰年)拥有的天数。** #include<stdio.h> #...
  • 数组下标越界异常是如何产生的

    千次阅读 2020-08-04 22:24:58
    首先,ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。 对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作...
  • C语言数组越界

    2020-01-19 22:13:01
    数组越界是指:数组定义时有十个元素,那么a[0] -- a[5] 分别对应相应的元素,在程序中如果使用了a[16]那么就超出了原来的数组定义的范围,这就是数组下标越界。 c和c++语言中数组下标越界,编译器是不会检查出错误...
  • 数组下标越界的避免方法

    万次阅读 2018-07-24 09:55:00
    为什么会出现数组下标越界C语言不检查数组下标的合法性 数组下标越界的危害 数组下标越界时,结果随机。可能导致程序功能不正常,也可能导致程序崩溃。 如何防止数组下标越界? 1、在使用循环遍历数组元素时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,262
精华内容 6,104
关键字:

c语言数组下标越界