精华内容
下载资源
问答
  • C语言数组下标越界

    千次阅读 2019-07-13 21:53:27
    C语言数组下标越界数组越界的严重性下标越界详细分析图后续待补充 数组越界的严重性 在 C 语言中,数组必须是静态的。数组的大小必须在程序运行前就确定下来。 C语言数组越界的严重性在于对数组元素访问及修改的内容...

    数组越界的严重性

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

    下标越界

    代码如下所示:

     #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]属于数组下标越界。

    详细分析图

    1、栈把内存分配给数组,并且自上而下从小地址开始分配内存,对应于数组下标:
    分配内存空间

    2、对数组进行内存分配之后进行数组循环赋值。数组下标为0~9在数组所分配的空间内。
    循环赋值
    3、由顶部代码可知数组访问将会越界,如图所示访问到数组范围之后,并且对越界空间进行操作,破坏原有数据。访问之后程序会破坏内存原有数据,导致缓冲区泄露,并且发生不可预知的错误。
    越界访问
    备注:如果代码中的溢出值刚好是数组的下标值i的话:
    i的值进入越界访问区
    那么刚好将循环中的i值置为0,程序进入死循环:
    缓冲区泄露
    上述情况只是多种可能中的一种,实际情况中,越界的内存中的数据具有不确定性。所以造成的后果也会是不确定的。这也就是下标越界问题的严重性所在。

    后续待补充

    在这里,我们只是引出数组下标越界,关于数组指针越界和数组越界的检查方法和避免方法将在之后引入

    展开全文
  • int z; int y[3] = { 2,3,4 }; y[y[2]] = 10; z=y[y[2]]; printf("%d", y[4]);...为什么计算机vs可以运行出结果等于10而不报错,按照数组的规则y[y[2]] = 10;不是应该下标溢出吗?哪个大佬可以解答一下

    int z;
    int y[3] = { 2,3,4 };
    y[y[2]] = 10;
    z=y[y[2]];
    printf("%d", y[y[2]]);

    为什么计算机vs可以运行出结果等于10而不报错,按照数组的规则y[y[2]] = 10;不是应该下标溢出吗?哪个大佬可以解答一下

    展开全文
  • 发现变量 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...

    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,数组越界访问 https://blog.csdn.net/qq_41209741/article/details/80465496 2,为什么数组要从 0 开始编号,而不是从 1 开始呢? ... 3,C----数组越界问题、指针入门 ...4,自身对C语言数组越界访问的

    1,数组越界访问

    https://blog.csdn.net/qq_41209741/article/details/80465496

    2,为什么数组要从 0 开始编号,而不是从 1 开始呢?

    https://blog.csdn.net/qq_44742154/article/details/105472777

    3,C----数组越界问题、指针入门

    https://blog.csdn.net/w1216702236/article/details/83120318

    4,自身对C语言数组越界访问的简易理解

    https://blog.csdn.net/liuchenxia8/article/details/78648876

    展开全文
  • 越界了,undefined behavior。你这个代码中,都是在栈上分配的,栈是高位往低位扩张,一开始栈的布局是这样的a9a8a7a6a5a4a3a2a1a0每次loop,会在低位申请然后又释放i,栈的布局:a9a8a7a6a5a4a3a2a1a0i这种情况下...
  • 数组下标越界的避免方法

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

    2020-07-30 09:22:18
    c语言数组的下标可以是负号,在代码运行前不会对数组是否下标越界、溢出等异常进行警告或处理,因此需人为干预。 测试代码: #include<stdio.h> #include <stdlib.h> int main(int argc, char *...
  • 越界了,undefined behavior。你这个代码中,都是在栈上分配的,栈是高位往低位扩张,一开始栈的布局是这样的a9a8a7a6a5a4a3a2a1a0每次loop,会在低位申请然后又释放i,栈的布局:a9a8a7a6a5a4a3a2a1a0i这种情况下...
  • 第7章数组 一维数组下标越界问题分析 第7章数组 数组元素的访问 访问数组元素时下标越界是大忌 编译器通常不检查下标越界导致程序运行时错误 下标越界将访问数组以外的空间 那里的数据是未知的不受我们掌控可能带来...
  • 如何解决数组下标越界异常 今天在写接口的时候运行发现有一个数组的下标越界异常了, 检查了一下发现实在上面的数组中有一些字符串没有大写,造成跟下面的数组字符串不一样,所以导致了数组下标越界异常。 ...
  • 主要内容:数组下标越界后测试、数组下标中“ ,”运算符,副作用 #include int main(int argc, char ** argv) { int a[2]={1,2},b[2] = {3,4};//输出未知值 int i = 0; printf("%d\n",b[0,2]); //逗号为一...
  • C语言数组下标-1你见过吗?

    千次阅读 2020-05-16 18:21:40
    不知道你有没有见过-1作为数组下标的,我算是见到了。当然这一点在Python之类的语言中毫不稀奇。 ​下标-1的代码 这里redis源码中的一部分: sdssdsMakeRoomFor(sdss,size_taddlen){ void*sh,*newsh; size_...
  • C数组下标越界

    2019-10-03 23:24:25
    之前总听说C语言的各种毛病,今天算是遇到一个:数组下标越界 事情经过 两段完成不相干的代码,一段是测温度的,一段是测转速的。两段代码单独运行都没有问题,但是若运行测转速的代码,测温度的数据就会发生错误。 ...
  • C语言数组下标是负数

    千次阅读 2012-04-12 10:33:06
    编程时我们经常会遇到处理边界问题的情况,这时... C语言数组下标必须是从0开始的,但C语言中的指针操作给我们提供了解决负数下标问题的方法。看下面一个示例: #include "stdafx.h" #include int main(int arg
  • C语言中的数组下标越界

    千次阅读 2014-02-02 03:25:58
    C语言中一般是不会检查数组下标范围的,例如: #include int main() { int i; int a[3]; a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4; for (i = 0; i ; i++) { printf("%d\n", a[i]); } return 1...
  • 编译器:dev-c++ ``` int iArray[3][4];...我是直接给越界的下标进行了赋值 以前以为只要是下标越界了 输出的都是无意义的数字 其实那是因为没有给越界的下标赋值 对吗 越界的下标为什么还能正常使用呀
  • c语言数组下标问题

    2010-07-03 11:37:00
    在用c语言编程的时候,定义了一个数组,0--39.是从【39】往下存。for(s32 sl32=39;sl32>0;sl32-=4),刚开始用的是u32 无符号数做下标,结果IAR编译的时候,报错了。...数组下标好像很少见到用有符号数的。
  • 数组下标越界解析(以C语言为例)

    千次阅读 2017-01-28 15:17:21
    这段时间把C++学完了顺带把C重学了一遍,有了汇编的基础后过去的很多疑惑都解开了,比如下面这道数组下标越界问题。 问题代码如下: #include  int Helloworld()  {  printf("HelloWorld");  return 0...
  • 这两天被人问了一个问题说假如C/C++访问下表越界数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以) ...
  • 数组下标越界

    千次阅读 2018-04-05 20:41:38
    原理:因为c语言不会检测数组下标,所以如果我们给数组一个超出它大小的下标,就会照成数组越界。如果是想数组中写入数据的话,就会造成数据写入到不属于数组的地方,或者说如果读取数据的话,就会读取到别的地方的...
  • 今天看代码的时候无意中看到了一个检测数组越界的代码段:if (size > 0) {if (str < end)*str = '\0';elseend[-1] = '\0';其中end是定义的内存空间的结束位置,如果访问越界了,就在结束前一个位置添加一个...
  • C++中数组下标越界程序并不报错是因为编译器不会对数组下标作越界检查造成的。 C语言非常重视运行时的效率,所以没有进行数组越界检查,而C++继承了C的效率要求,自然也不做数组越界检查。(检查数据越界,编译器...
  • 数组下标越界 :在引用数组元素时,使用的下标超过了该数组下标的应有范围。 但应注意的是: C/C++不对数组做边界检查。 可以重写数组的每一端,并写入一些其他变量的数组或者甚至是写入程序的代码。不检查下标是否...
  • 代码很简单,定义变量mmm,中间在循环中运算了一个数组aaa,后面用到了while(m−−)while(m--)while(m−−),然后问题来了,m被改变了…纠结了很久没发现问题,后来了解到是数组下标越界产生的影响(盲点,一般数组...
  • C语言的编译器是不检查下标越界的,以前知道这个问题,可是没有想过是什么原因?  总结如下:  1,不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的...
  • 这两天被人问了一个问题说假如C/C++访问下表越界数组元素会报错么,于是充满好奇心的我动手试了一下,WTF,果然没有报错,但是会给程序带来莫名其妙的结果(比如十次的循环但是变成了死循环,但八次却可以)例:1 #...
  • 1、为了提高运行效率,不检查数组下表越界,程序就可以跑得快。因为C语言并不是一个快速开发语言,它要求开发人员保证所有逻辑的正确性。所以至少到目前为止,C语言是所有高级语言中速度最快,效率最高的。几乎所有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,329
精华内容 4,531
关键字:

c语言数组下标越界

c语言 订阅