精华内容
下载资源
问答
  • c语言下标越界
    千次阅读
    2018-06-23 15:49:47

    C 语言中的内存分配机制暂不了解!

    GCC --version

    6.3.0-18+deb9u1 20170516

    代码

    #include<stdio.h>
    int main{
        int a[3]={1,2,3};
        int i;
        printf("%p    %p    %p    %p    %p\n",&a[0],&a[1],&a[2],&a[3],&i);
        for(i=0;i<=3;i++){
        a[i]=0;
        printf("%d\n",a[i]);
    }
        return 0;
    }

    运行结果:

    0x7ffc993e48e4 0x7ffc993e48e8 0x7ffc993e48ec 0x7ffc993e48f0 0x7ffc993e48e0
    0
    0
    0
    0
    

    发现变量 i 的地址是在数组之前。

    改变一下程序:先声明 i

    #include<stdio.h>
    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<=3;i++){
        a[i]=0;
        printf("%d\n",a[i]);
    }
        return 0;
    }
    0x7ffc993e48e4 0x7ffc993e48e8 0x7ffc993e48ec 0x7ffc993e48f0 0x7ffc993e48f0
    0
    0
    0
    0
    ...
    ...

    可以看到 变量 i 在内存中的地址实际上就是 a[3] 在内存中的地址,可是我明明是先声明的变量 i ,难道是因为没有定义?

    即使先定义i

    int i=0;

    结果一样!

    不明白为什么!希望以后可以回来解答。






    更多相关内容
  • 数组下标越界简介 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 语言 数组下标越界

    展开全文
  • 点击上方蓝字关注我,了解更多咨询1、若数组长度和下标访问值出现错误,则会导致数组下标越界。数组下标从0开始,访问值为-1。2、在使用循环遍历数组元素时,注意防范off-by-one的错误。对于作为函数参数传入的数组...

    6b60713add08b3459c580685e078d2f9.png

    点击上方蓝字关注我,了解更多咨询

    b578f405f4e987099e5ce6a5ac9d0eab.png

    1、若数组长度和下标访问值出现错误,则会导致数组下标越界。数组下标从0开始,访问值为-1。

    2、在使用循环遍历数组元素时,注意防范off-by-one的错误。

    对于作为函数参数传入的数组下标,要判断其合法性。

    实例

    //如果是整形数组
    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++)
    {
        //.....
    }

    3d11930c9d9535237c0f915a2cdadd2e.png

    END

    *声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

    fd4761a0233ff785c125b414ec0d8264.png

    41f6f08feb98535be5f95c7a403c1a69.gif

    戳“阅读原文”我们一起进步

    展开全文
  • 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、栈把内存分配给数组,并且自上而下从小地址开
  • 在后面输出对应月份的天数的时候,我们用的下标是month-1,因为数组的下标是从0-11,我们输入的是1-12,所以-1后才是我们对应需要的月份。 2. 二维数组 一维数组比较简单,我们来看二维数组。下面是一个二维数组的...
  • #include<stdio.h> int main() ...在这段代码中,很明显看出是有问题的,当for循环大于9以后下标越界了,但这段代码放在vs2019中却能运行起来,这是为什么呢? 结论:因为i和arr是局部变..
  • 数组下标越界和内存溢出简介 二.数组下标越界和内存溢出区别 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.数组下标越界和内存溢出简介 **溢出本义是算术...
  • 这两天被人问了一个问题说假如C/C++访问下表越界的数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以)例:1 #...
  • 数组下标越界解析(以C语言为例)

    千次阅读 2017-01-28 15:17:21
    这段时间把C++学完了顺带把C重学了一遍,有了汇编的基础后过去的很多疑惑都解开了,比如下面这道数组下标越界问题。 问题代码如下: #include  int Helloworld()  {  printf("HelloWorld");  return 0...
  • 数组下标越界

    2021-05-21 04:44:51
    已结贴√问题点数:20回复次数:11 数组下标越界题目是一个有10个元素的数组,存有10个考生的分数,写5个函数,分别计算总分,最高分,最低分,平均分,分数升序排列。我写了5函数,问题出在最高分和最低分函数上。...
  • 内存越界是软件系统主要错误之一,其后果往往不可预料且非常严重。更麻烦的是,它出现的时机是随机的,表现出来的症状是随机的,而且造成的后果也是随机的,这会使程序员很难找出这些 Bug 的现象和本质之间的联系,...
  • C语言对数组下标不做检查,指针常常越界访问;我们编程时要特别注意。一、示范代码#include#includeint a[10];int b[10];void main(){memset(a,0,sizeof(int)*10);memset(b,0,sizeof(int)*10);a[10]=10;cout<}...
  • 1、为了提高运行效率,不检查数组下表越界,程序就可以跑得快。因为C语言并不是一个快速开发语言,它要求开发人员保证所有逻辑的正确性。所以至少到目前为止,C语言是所有高级语言中速度最快,效率最高的。几乎所有...
  • 对于数组把握和理解不深的同学·们来说,数组下标越界一直是个头疼的问题,有没有什么好的方法去检测变量什么时候会导致数组越界呢?这是这篇文章介绍的重点 assert断言函数 头文件 <assert.h>,C++中是<...
  • 这个数组下标越界很明显,声明时明明是b[5],使用时却不能用b[5],没错,C语言就是这样设计的。 这段程序将显示一个随机值吗?错,它显示变量a的值,即6543,不是随机值。这是为什么?要从栈的结构说起。 栈是从高...
  • 数组下标越界是一个编程初学者最容易犯的错误。 以一个简单的一维数组为例: int a[10];这是一个整型的数组a,有10个元素:a[0]-a[9],因为正确的下标应该是从0开始,到9结束,与生活习惯中的1-10不一样,于是...
  • 关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误...
  • C语言中数组越界

    2020-01-19 22:13:01
    数组越界是指:数组定义时有十个元素,那么a[0] -- a[5] 分别对应相应的元素,在程序中如果使用了a[16]那么就超出了原来的数组定义的范围,这就是数组下标越界。 c和c++语言中数组下标越界,编译器是不会检查出错误...
  • 很多书里面都会说array[5]会出现下标越界的错误,没错这确实是越界了,但实际上编译器并不会给你报错。 下面来看一段代码 #include <stdio.h> void showArray(int *array, int arrayLenth) { for (int i = 0...
  • 好处: 不需要浪费时间对有些已知是正确的数组下边进行检查,增加程序运行效率 坏处: 使无效的下标无法被检测出来,产生越界,这样做事很危险的,充满未知性
  • 数组下标越界的避免方法

    万次阅读 2018-07-24 09:55:00
    为什么会出现数组下标越界C语言不检查数组下标的合法性 数组下标越界的危害 数组下标越界时,结果随机。可能导致程序功能不正常,也可能导致程序崩溃。 如何防止数组下标越界? 1、在使用循环遍历数组元素时...
  • 1,字符串操作越界: void test_char() { char a[] = {'a','s','d','e'}; printf("strlen(a) = %d\n",strlen(a));//strlen 遇到'\0'结束,a没有结束符,此时可能出现越界一般用sizeof而不用strlen } 我们开始看...
  • 详详解解C语语言言数数组组越越界界及及其其避避免免方方法法所谓的数组越界,简单地讲就是指数组下标变量的取值 过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最...
  • 栈的使用习惯是按照代码定义变量的顺序,先分配高地址处的空间,再分配低地址处的空间,而数组是随着下标的增长,地址逐渐变大。以下图可以简单表示一下上述所说内容: 如图,如果i和arr数组之间的空间合适的话,就...
  • C语言数组越界问题实例

    千次阅读 2014-09-11 16:22:49
    然后再被用,如果在变量后面会先被用,然后自身增加1,不仅仅是赋值,被数组下标引用的时候也是,不过我似乎遇到了很多坑,一个是自己当初粗心编写测试的时候有误,一个是C语言的数组越界问题一直没有考虑。...
  • 关于C++中数组下标越界不报错的问题

    千次阅读 多人点赞 2019-12-08 16:19:39
    C++中数组下标越界程序并不报错是因为编译器不会对数组下标作越界检查造成的。 C语言非常重视运行时的效率,所以没有进行数组越界检查,而C++继承了C的效率要求,自然也不做数组越界检查。(检查数据越界,编译器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,123
精华内容 6,449
关键字:

c语言下标越界