精华内容
下载资源
问答
  • 文章目录指针的定义 指针的定义 指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。简单的说,电脑内存中的每一个字节都有一个编号,指针中存储的就是这个编号,可以找到唯一...

    指针的定义

      指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。简单的说,电脑内存中的每一个字节都有一个编号,指针中存储的就是这个编号,可以找到唯一确定的一个内存单元。我们通常写代码中定义的*p,这个并不是真正意义上的指针,而是指针变量。

    易混淆的问题

    1. 指针减去一个指针,得到结果并不是字节差,而是中间差了多少个相同的类型,也就是字节差还要除以指针的类型。
    2. 指针大小和指针加i的理解,指针在32位计算机下是4个字节,在64位下可以是4字节,也可以是8字节,具体看情况,指针是存地址的,一个字节能表示的最大范围是0~255,而这对于计算机来说是远远不够的,因此,需要4个字节,一个字节是2 ^8,4个字节是2 ^32,而对于指针加i来说,指针表示的是这组数据中的第一个元素的首地址,当i等于1时,数据加对应类型的地址。

    实例

    在这里插入图片描述
    代码

    #include <stdio.h>
    int main()
    {
    	int i = 0;
    	int arr[10] = { 0 };
    	int* a = arr;
    	for (i = 0; i <= 12; i++)
    	{
    		*(a+i) = 0;
    		printf("sb %d", i);
    	}
    
    	return 0;
    }
    

      简单的分析一下代码,创建一个int类型的数组,数组可以存10个数据,字节大小为40,因为初始化第一个元素为0,后面未初始化,所以后面的元素默认为0,然后创建了一个int类型的指针,里面存储的是数组arr下的第一个元素的地址,for循环循环13次,很明显这已经超出数组的范围,,并且循环中将数组内的元素又重新赋值为0,并且打印出sb和i的值,细心的人还会发现,函数明明循环12次,但是在打印过程中并没有输出过12。之后,通过运行会发现,这段代码首先没有报错,并且是一个死循环,这是因为系统对于数组的越界是进行抽查的,并不是所有的越界编译器都能发现,对于死循环这个问题,我通过调试查看arr首元素的地址,进行调试
    在这里插入图片描述
      地址0x00D5FC68为arr首元素的地址,地址0x00D5FC98为i的地址,由于数组越界,将i的值在第12循环时重新赋值为0,导致循环在重新开始,反复如此形成死循环。

    野指针

      官方说就是未初始化的指针和数组越界的指针,通俗的讲就是不知道指针指向了哪里。编译器在使用的时候往往可以取到里面的值,但是在程序结束释放资源的时候,因为这部分资源原本就不属于它,因此程序就会出现问题。

    空指针

      不指向任何对象或者函数的指针,在初始化、赋值或者比较的时候,如果一边是指针类型的值或表达式,编译器可以确定另一边的常数0为空指针并生成正确的空指针值。

    char *p = 0;
    if (p != 0)
    

    野指针和空指针辨析

      野指针是指向任意位置的指针,空指针确保不指向任何对象或者函数。两者的声明方式和来源也不同,合理的利用空指针可以避免内存泄露。

    指针数组和数组指针辨析

      指针数组和数组指针两者截然不同,指针数组本质上任然是数组,只是数组中存储的数据都是指针类型,而数组指针本质上是指针,是一个指向数组的指针。其中两者的定义方法也是不同的。

    //指针数组
    int* arr1[10];
    //数组指针
    int  arr2[10];
    int (*p2)[10] = &arr2;
    

      这两种方法定义出来的初始值是一样的,但是当给两个同时加1时, 指针数组改变了1个字节,数组指针却需要改变4个字节。

    展开全文
  • 指针数组越界的思考

    2021-01-18 15:22:37
    遇到了一个奇怪的问题,在for循环内,if判断指针指向的内容,for循环次数超越指针数组范围,没有报错!!! C语言编译器是不会对数组下标进行越界检查的,于是重新回顾一下内存溢出和内存越界: 内存溢出:你要分配...

    遇到了一个奇怪的问题,在for循环内,if判断指针指向的内容,for循环次数超越指针数组范围,没有报错!!!

    C语言编译器是不会对数组下标进行越界检查的,于是重新回顾一下内存溢出和内存越界:

    1. 内存溢出:你要分配的内存超出了系统能给你的,系统不能满足需求,于是产生了溢出;
    2. 内存越界:你想系统申请一块内存,在使用的这块内存的时候,超过出了你申请的范围。

    然后在内存越界的基础上,我这次又有了新的理解:

    1. 越界访问:仅仅越界读取内容,不一定会造成段错误(linux 越界读取,是不会出现段错误的),或者程序崩溃死机问题;这个真的是看运行环境!
    2. 越界修改:越界写入内容或者修改,一定会产生段错误 Segmentation fault (core dumped),导致程序崩溃死机。

     

    先看一下内核版本: 是基于这个内核版本进行试验。

    zhang@ubuntu140453200:/mnt/external/zhang/test/linux_c$ uname -i
    x86_64
    zhang@ubuntu140453200:/mnt/external/zhang/test/linux_c$
    zhang@ubuntu140453200:/mnt/external/zhang/test/linux_c$ uname -a
    Linux ubuntu140453200 3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    zhang@ubuntu140453200:/mnt/external/zhang/test/linux_c$

    下面的例子是从项目代码拷贝出来的,操作是一样的,也是多循环了128次。

    在ASR或者高通平台上面跑是没有问题的。但是问题以奇怪的方式显现出来,当打开串口抓取log时,程序就卡在for循环的判断,if(p[i] == ';') 判断分号这里,然后超过30秒被系统kill掉,返回ERROR。还有云端设置主动上报时,也会卡死在这里。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_LENGTH 1024
    
    int main(int argc, char *argv[])
    {
        int i = 0;
        char *p = NULL;
        char buf[MAX_LENGTH] = {0};
        memset(buf, 0, sizeof(buf));
    
        p = buf;
        for(i=0; i < 256; i++)
        {
            p[i] = 0x35;
        }
        p[i] = '\0';
    
        for(i = 0; i < (MAX_LENGTH+128); i++)
        {
            if(p[i] == ';')
            {
                printf("find ;   index %d \n", i);
                break;
            }
            if(i >= MAX_LENGTH)
            {
                printf(" index %d\n", i);
            }
        }
        return 0;
    }
    
    运行结果:
    zhang@ubuntu140453200:/mnt/external/zhang/test/linux_c$./pointer_2
     index 1024
     index 1025
     ...
     ...
     ...
     index 1150
     index 1151
    zhang@ubuntu140453200:/mnt/external/zhang/test/linux_c$

            需要加判断跳出for循环,程序的修改如下:

    for(i = 0; i < (MAX_LENGTH+128); i++)
    {
        if(p[i] == ';')
        {
            printf("find ;   index %d \n", i);
            break;
        }
        if(i >= MAX_LENGTH)
        {
            printf(" index %d\n", i);
        }
        //这里加上判断是否到达字符串的结尾,到达结尾跳出循环,越界了又没有跳出循环,奇奇怪怪的问题就来了
        if(p[i] == '\0'){
            break;
        }
    }

    越界访问与越界修改差异很大,于是我有突发奇想,试试memset,对数组进行越界尝试,动手写了一个程序,发现越界时也没有报错,程序还是执行下去了,没有在我期待的地方报错,出现  Aborted (core dumped)  或者Segmentation fault (core dumped) 或者 bus error 这样的错误。

    有两个期待:

    1. 无论执行前面的memset还是后面的memset,都应该出现段错误Segmentation fault (core dumped),或者是总线错误;
    2. 注释掉第一个memset,如果是没有出现段错误,那么后面第二次打印与第一次打印应该有差异,理由是memset会对后面的堆栈空间进行修改。

    结果这两个期待都没出现!!!

     int a = -1;
     char b[16]="123456";
     //memset(b, 0,32); //注意这里越界访问了,只有16字节空间,却修改了32字节
     int c = -1;
    
     printf("a=%d,c=%d\n", a,c);
     printf("a=%d,c=%d\n", a,c);
    
     a = 1;
     c = 2;
     memset(b, 0,32); //注意这里越界访问了,只有16字节空间,却修改了32字节
     printf("a=%d,c=%d\n", a,c);
     printf("a=%d,c=%d\n", a,c);
    
    
    运行结果:
    zhang@ubuntu140453200:/mnt/external/zhang/test/linux_c$./pointer_2
    a=-1,c=-1
    a=-1,c=-1
    a=1,c=2
    a=1,c=2
    zhang@ubuntu140453200:/mnt/external/zhang/test/linux_c$
    

    原因分析与调试:

    1. 在linux系统中分配内存空间并不是连续的,是存在了优化,这一点可以加 %p打印地址(结果证明不是连续的)
    2. 如果想取消这种优化,使用限制字符 volatile 
    3. 编译时选用 -o0 参数,这样才能取消内部优化机制
    4. 使用gdb单步调试

     

    展开全文
  • 然后针对指针与数组,总体介绍了它们之间的联系与转换,并详细描述了数组越界的两类错误,最后我们经过详细分析,模拟出一种对数组下标是否越界的检测方法。关键词:指针错误使用;数组越界中图分类号:TP311文献...

    摘要:该文从指针在C语言中的作用入题,介绍了指针使用过程中常见的几种错误,并提出了改进方法。然后针对指针与数组,总体介绍了它们之间的联系与转换,并详细描述了数组越界的两类错误,最后我们经过详细分析,模拟出一种对数组下标是否越界的检测方法。

    关键词:指针错误使用;数组越界

    中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)13-3077-04

    计算机内存中每个存储单元都有其存储地址,根据存储地址即可准确地找到该内存单元。通常把这个地址称为指针。在C语言中,指针变量就是用来存放内存单元地址的变量类型,简称指针[1]。灵活的使用指针可以表示各种数据结构,动态地分配内存,有效地处理数组,从而编写出精炼而又高效的程序。但是,在指针这种直接访问内存的方便有效的同时,也很容易因使用的错误而给系统带来隐患。

    1 C语言中常见的指针错误使用

    1.1 指针变量未赋初始值

    指针变量未赋初始值容易产生野指针。野指针是指指向不可用内存区域的指针。它不像空指针能够通过if语句比较容易的进行判断,从而避免非法的访问。通常对野指针进行操作的话,将会产生不可预知的错误,甚至使程序崩溃。若指针没有被赋予其初始值,则它们的值不会自动初始化,而是随机的,从而无法判断指针是否指向了合理的内存空间。因此,在创建指针变量的时候应当及时对其进行初始化,方法是将指针设置为NULL,或者将它指向合法的内存。

    1.2 指针指向的内存已经被释放

    在使用指针进行动态内存分配操作时,指针p被free或者delete之后,指针变量本身并没有被删除掉,若没有置为NULL,会让人误以为p是个合法的指针而在以后的程序中错误的使用它。这时候通常又会使用语句if (p != NULL)进行判断以避免发生错误。但是,此时,p虽不是NULL指针,但它也不指向合法的内存块,所以不会收到防错的效果。例如:

    void text()

    {

    1.char *p = (char *) malloc(50);

    2.if(p != NULL)

    3.strcpy(p, “hello”);

    4.free(p); // p指向不合法的内存

    5.if(p != NULL) // 不会收到防错的效果

    6.strcpy(p, “world”); //发生错误

    }

    在这个程序中,应该在第四行之后加上p=NULL; 即在p释放之后就直接将

    P置为NULL,就不会发生后续错误。

    1.3 指针引起的内存泄露

    C语言中内存的申请与释放均是由程序员控制,并不像Java中自带有自动垃圾回收机制,虚拟机会释放已经没有用的内存。当程序员在使用完所申请的内存之后,却并没有释放它们的时候,就出现了内存泄露。一旦泄露达到一定的程度,就会导致系统崩溃。

    1.4 指针被重复释放

    在上面我们讨论了指针没有及时释放而造成内存泄露的情况,但是,反之,若对于已申请的内存进行了重复性释放,同样会使可执行程序产生致命的错误。例如[2]:

    1.void text1 () {

    2.int *p = new int (10) ;

    3.text2 (p) ;

    4.}

    5.void text2 (int * p) {

    6.if (…)

    7.delete p;

    8.else

    9.text3 (p) ;

    10.}

    11.void text3 (int * p) {

    12.if (…)

    13.delete p;

    14.else

    15.text4 (p) ;

    16.}

    此时函数text1中指针p申请了内存,并传递给text2。然后函数text2中进行判断1(第6行),若条件成立则释放指针p,否则将指针p继续传递给函数text3。函数text3进行与text2一样的操作,先进行判断2(第12行),若成立则释放p,否则继续传递给其他函数。

    然而,若判断1和判断2在某些情况下会同时成立时,就出现了重复释放指针p的情况,也就造成了内存的重复释放。重复释放内存会导致程序异常终止而发生难以预知的错误,并且往往这种错误难以发现。这时,我们可以采用在释放内存前先检查内存是否为空,然后释放内存的同时,对指针p进行赋空值的操作,这样就会避免这种情况的发生。

    1.5 指针的使用超出其作用范围

    C语言中变量可分为局部变量和全局变量,而局部变量只能在其生成期有效。而当对局部变量使用指针时,指针应当使用在局部变量的作用域内来进行对局部变量的访问。否则,该指针也指向了不合法的内存而发生错误。这种情况下,我们应该避免使用作用域大的指针变量指向作用域小的变量。

    2 指针与数组

    在C语言中,数组是一种数据单元的序列。在访问数组元素时,除了可以用下标访问以外,还可以通过指针来访问数组变量。

    2.1 指针与一维数组

    一维数组是一个线性表,它是按顺序存放在一片连续的存储单元中。数组元素由数组名和整数表示的下标表示。其中,数组名是数组变量在内存中的起始地址。在C语言中对数组元素进行访问时,都是通过数组名加上起始地址的相对量(即下标)来得到要访问元素的地址,然后再实现对其内容的访问。实际上,在编译系统中,是将数组元素的形式首先转换为*(a+j),然后才进行其地址的计算得到要访问元素的地址。由此可见,C语言对数组的处理,实际上是转换成指针地址的运算。

    例如:

    void main()

    {

    int a[5]={1,2,3,4,5};

    int *p,i;

    p=a;//指针p指向数组第一个元素,等价于p=&a[0]

    for(i=0; i

    {

    printf(“%d ”,*p);//输出指针指向的内容

    p++;

    }}

    此程序运行结果为:

    1 2 3 4 5

    2.2指针与多维数组

    多维数组均可分解为多个一维数组来处理,以多维数组的列数作为这些一维数组的长度。

    这里我们以二维数组为例。二维数组是按行存放的,所以也可以把二维数组看成是特殊的一维数组。如图1所示。

    例如:

    int a[2][3]={{1,3,5},{2,4,6}};

    我们可以假设数组a在内存中的分配情况如表1所示[3]。

    当用指针变量指向这个二维数组时,引用元素a[i][j]的地址将换算为*(a+i)+j ,该元素的值为*(*(a+i)+j)。还需要注意的是,若p=a[0],在上述例子中的操作p++此时不是指向a[0][1],而是指向a[1],即p的增值是以一维数组的长度为单位,此处一维数组的长度就是指二维数组的列数。

    3 数组越界

    数组访问越界是指数组下标变量的取值超过了初始定义时的大小, 导致对数组元素的访问出现在数组的范围之外, 这类错误是C语言程序中的常见错误[4]。在C语言中数组的两端都有可能越界而使其他变量的数据甚至程序代码被破坏。因为在C语言中,数组必须是静态的。换而言之,数组的大小必须在程序运行前就应当被确定下来。由于C语言并不具有Java中现有的静态分析工具的功能[5],可以对程序中数组下标取值范围进行严格检查,一旦发现数组上溢或下溢,都会抛出异常而终止程序,因此,数组下标的取值范围只能进行预先推断一个值来确定数组的维数。因此对于C语言来说,数组的边界检验是程序员的职责。

    3.1 数组越界错误的分类

    数组越界错误主要包括数组下标取值越界和指向数组的指针的指向范围越界。数组下标取值越界主要是指访问数组的时候,下标的取值不在已定义好的数组的取值范围,而访问的是无法获取的内存地址。例如:int a[10],则此时数组a的下标取值范围是[0,9]。若取值不在这个范围,则就出现了越界错误。而指向数组的指针的指向范围越界与前面所讲述的指针与数组有一定联系。只是当定义的指针p若指向了数组的首地址时(即p=a),若对其不断进行操作p++,则最后会导致指针p指向大于该数组的范围的上界,从而也是使程序访问了数组以外的存储单元,造成数组越界。

    3.2 数组越界的环境模拟

    对于上述中的数组越界错误,我们经过详细分析,模拟出一种对数组下标是否越界的检测方法。具体代码如下:

    #include

    #include

    void text1(int x)

    {

    int a;

    printf("请输入待测下标(a):");

    scanf("%d",&a);

    if(ax-1) printf("数组越界\n");

    else printf("使用正确\n");

    }

    void text2(int x, int y)

    {

    int a,b;

    printf("请输入待测下标(a,b):");

    flushall();//清空缓冲区

    scanf("%d%d",&a,&b);

    if(ax-1 || by-1) printf("数组越界\n");

    else printf("使用正确\n");

    }

    void text3(int x, int y, int z)

    {

    int a,b,c;

    printf("请输入待测下标(a,b,c):");

    flushall();

    scanf("%d%d%d",&a,&b,&c);

    if(ax-1 || by-1 || cz-1) printf("数组越界\n");

    else printf("使用正确\n");

    }

    void main()

    {

    int n,i,j,k;

    char m;

    L:printf("请输入所要检测数组的维度(n

    scanf("%d",&n);

    switch(n)

    {

    case 1:printf("请输入数组下标(i): ");

    scanf("%d",&i);

    text1(i);break;

    case 2:printf("请输入数组下标(i,j):");

    scanf("%d%d",&i,&j);

    text2(i,j);break;

    case 3:printf("请输入数组下标(i,j,k):");

    scanf("%d%d%d",&i,&j,&k);

    text3(i,j,k);break;

    }

    printf("是否继续检测(Y/N):");

    flushall();

    scanf("%c",&m);

    switch(m)

    {

    case 'Y':goto L; break;

    case 'y':goto L; break;

    default: exit;

    }

    }

    检测结果如图2所示。

    4 结束语

    指针时C语言中广泛使用的一种类型,灵活正确的掌握指针在C语言中的运用,是学好C语言的关键的一步,能否正确理解和使用指针是掌握C语言的一个重要标志。本文总结了C语言中指针使用的常见错误,并分析提出了改进方法。不过这些还远远不够,对于指针在结构类型、函数等方面的运用还有待研究。

    参考文献:

    [1] 王敬华,林萍,陈静.C语言程序设计教程[M].北京:清华大学出版社,2005:266.

    [2] 马宇哲.C++指针应用的四大误区[J].电脑编程技巧与维护,2010(8):134-135.

    [3] 张颖.C语言中数组与指针的使用技巧[J].学术研究,2009(4):33-35.

    [4] 叶焰锋,叶俊民.数组越界的故障模型及其检测方法研究[J].微计算机子信息,2007,23(11-1):145-147.

    [5] 陈柏强,郭涛.Java程序中数组越界和空指针错误的静态分析[J].计算机应用,2009,29(5):1376-1378.

    注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

    展开全文
  • 如果访问数组元素时,数组索引编号并不存在,将会发生索引越界异常 原因和解决办法:索引编号写错了,改正即可 报错二:NullPointerException 所有的引用变量,都可以赋值一个null值,但是它代表什么都没有 原因...

    报错一:ArrayIndexOutOfBoundsException

    如果访问数组元素时,数组索引编号并不存在,将会发生索引越界异常

    原因和解决办法:索引编号写错了,改正即可

    报错二:NullPointerException

    所有的引用变量,都可以赋值一个null值,但是它代表什么都没有

    原因:如果忘了new,元素为空或null,就会报错

    解决办法:new一下

    展开全文
  • 关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误...
  • 一、数组越界问题 ** 阅读下面的程序,你觉得结果会是怎样的呢??? int main() { int i; int arr[10]; for( int i = 0; i&amp;lt;=10; i++) { arr[i] = 0; printf(&quot;%d\n&...
  • 数组越界会发生什么

    千次阅读 多人点赞 2021-09-14 21:11:20
    文章目录一、数组越界会发生什么二、 数组越界详解 一、数组越界会发生什么 C语言非常重视运行时的效率,所以没有进行数组越界检查,而C++继承了C的效率要求,自然也不做数组越界检查。(检查数据越界,编译器就必须...
  • 数组索引越界异常 ArrayIndexOutOfBoundsException 原因:索引编号写错了。 解决:修改成为存在的正确索引编号。 public class Demo01ArrayIndex { public static void main(String[] args) { int[] array = {15...
  • C++ 数组越界的例子

    2020-12-26 15:27:58
    C++ 数组越界的例子 C++ 对于数组是否越界不会做检查。我们来看看下面这个例子的运行结果。下面是一个学习笔记: 示例代码 #include <iostream> #include <array> using namespace std; int ...
  • 主要内容:数组越界问题和指针初入门例子分析 一、 数组越界问题 例子思考 int main() { int i; int arr[10]; for(i=0;i&lt;=10;i++) { arr[i] = 0; printf("%d\n",i); } return 0; } ...
  • 数组越界

    2021-02-22 22:10:29
    刚学数组那会儿,经常会看到数组越界四个字,当时我也是一脸懵逼 ,现在终于有时间来抓一下这条虫了。 定义:所谓数组越界,就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围...
  • 所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最常见的错误之一。 在 C 语言中,数组必须是静态的。换而言之,...
  • 牛客网上做一道编程题,一直报出数组越界问题,但是我一直没看出来哪里越界了求助攻我的思路是 判断目标数是否在当前行范围中,若是,采用二分法咋找,若不是,跳到下一行public class Solution {public boolean ...
  • 循环判定条件里,只要有数组某个元素的判定值,随着游标的移动,很容易出现数组越界的情况。 根据 and 的特性:只要失败就不判定后面的条件了。所以可以先判断游标是否越界,再判断该游标对应的list中的数据是否...
  • //选择 Yes with SEH Exceptions (/EHa) 这样的话C++的try catch 也可以捕获到空指针,内存越界,0除异常  //默认是选择Yes (/EHsc)  **********************************/    void TestIntType()  {...
  • 数组越界异常: 数组的索引编号从零开始,直到“数组的长度-1"为止。 package 数组java; /** * @Author: Jason * @Date: 2019/5/29 10:09 * @Version 1.0 */ public class DemoArrayOne { public static ...
  • 详详解解C语语言言数数组组越越界界及及其其避避免免方方法法所谓的数组越界,简单地讲就是指数组下标变量的取值 过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是 C 语言程序中最...
  • Keil调试笔记:数组越界

    千次阅读 2020-02-01 21:43:33
    但由于需求改变,实际上使用了7个double值,于是由于数组越界,意外改变了下一个静态/全局变量的值。 查找问题引发源的方式 2 : =========================================================================...
  • C++数组越界问题

    2021-11-16 10:54:19
    C++数组越界内存地址分配数组时间复杂度访问越界问题 内存地址分配 计算机中会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据,当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址...
  • PWN入门之数组越界

    2019-05-04 09:34:35
    利用数组越界的特性,去填充不能利用栈溢出的方法去覆盖的值。 通过这次实验,使我们掌握利用数组越界去继续泄露的方法。 实验文件 链接:https://pan.baidu.com/s/1tLyKYjdLXjLKjRHoivhYnQ 提取码:m6ra 我们...
  • 1.数组越界异常 观察一下代码,运行后会出现什么结果 public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println(arr[3]); } 运行结果: 原因: 创建数...
  • C语言中字符数组越界会怎样?

    千次阅读 多人点赞 2020-04-14 17:39:27
    我们都知道C语言中的数组是不允许动态调整程度的,所有的数组都必须在声明的时候就指定它的长度,比如: char str[]; 就会报错: [Error] storage size of ‘str’ isn’t known 提示我数组的大小是未知的。事情是...
  • 数组越界带来的后果

    千次阅读 2018-12-17 21:19:51
    上周写数据结构作业,遇到了一个奇怪的现象,涉及到图比较复杂,简化后就是如下的代码: ...之前一直说数组越界会导致一些不可名状的错误,之前一直不知道是什么,现在终于知道了,记录下来提醒自己
  • C/C++数组越界

    千次阅读 2019-04-13 00:44:34
    今天做题的时候,一个本来要存2058个数的数组被我开成了2048,但是没有爆RE,而是给了个WA。。。。后来找了好久才发现,然后就特意找了找为什么 ---- 我是分割线 ----- 下面我们看一下这段代码 #include <stdio...
  • 代码如下,我定义的数组长度是3, 为什么我可以在for循环中无错误地访问p[3]呢?不应该最多访问到p[2]吗? 也就是说,越界1位不会报错,但是超过1位就会报错了。 求大佬解释。 ``` #include using ...
  • 单片机调试经常遇到各种奇怪的...这个数组也确实有个指针在中断里没有约束,自己认为不会越界,但还是越界了, 更改方法就简单了,给指针加约束或是直接扩大数组。 因为空间足够(懒)的原因,空间直接给他翻倍,改完.
  • c语言数组越界的避免方法

    千次阅读 2019-09-08 16:27:15
    1、尽量显式地指定数组的边界 #define MAX 10 … int a[MAX]={1,2,3,4,5,6,7,8,9,10}; 在 C99 标准中,还允许我们使用单个指示符为数组的两段“分配”空间,如下面的代码所示: int a[MAX]={1,2,3,4,5,[MAX-5]=6,7...
  • 实现数组越界检测 这里我们重载的是 [ ] 运算符。它被认为是一个双目运算符。 例如 X[Y] 可以看成: [ ] 双目运算符 X 左操作数 Y 右操作数 假设 X 是某一个类的对象,类中定义了重载[ ]的 operator[ ] 函数,则...
  • mov 0xc00(%r9),%rax 经分析是指针数组seg_array_next[200] = 中指针地址错误, 导致异常地址访问,系统crash。 这个是delete操作,怀疑方向转到了重复释放上,然而查阅代码,没找重复释放问题。 增加add/del相关log...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,848
精华内容 32,339
关键字:

指针数组越界