单片机学习小组
直播中

刘桂兰

7年用户 936经验值
私信 关注

为什么C语言通过数组下标越界访问却不报错

为什么C语言通过数组下标越界访问却不报错?这是什么原因?

回帖(1)

周伟

2022-2-25 09:41:19
数组下标越界访问却不报错,正常运行??


//初始化定义程序:
void main(void)
{
        unsigned char code[4]=0;
        unsigned char code_1[4]=0; //两句等于unsigned char buf[8]=0;
}

//程序调用端
code[0]=num%10;                       
code[1]=num/10%10;               
code[2]=num/100%10;      
code[3]=num/1000%10;               
code[4]=fre%10;                       
code[5]=fre/10%10;               
code[6]=fre/100%10;               
code[7]=fre/1000%10;                                                      



运行平台:51单片机+keil5
现象描述:使用buf[]可以访问到code_1的数组内容。


原因分析:



  • 因为,分开连续定义两个4个8位char型内存,但是类型一样,于是cpu可以读取连续数组无误。在内存层面,调用数组内存是没有数组名字,buf[7]就是读buf[0]地址偏移7位的地址,地址类型都一样,所以写入和读取正常,没有非法访问现象。
  • 另外一个原因就是51的gcc编译器检错能力比较有限。


二维数组


int main ()
{
        int a[3][4] = {{1,2}, {0}, {4, 6, 8, 10}};
        printf("输出结果为:%dn", a[1][2]);
        printf("输出结果为:%dn", a[1][0]);
        printf("输出结果为:%dn", a[1][1]);
        printf("输出结果为:%dn", a[1][3]);
        printf("输出结果为:%dn", a[0][3]);
        printf("输出结果为:%dn", a[0][2]);
        return 0;
}

输出结果都为0

多维数组


int main ()
{
        int a[3][4][3] = {{{1,2}}, {{1}}, {4, 6, 8}};
        printf("输出结果为:%dn", a[1][0][0]);
        printf("输出结果为:%dn", a[5]);


    return 0;
    }

#include

int main ()
{
        int a3d[2][2][3] =    { { { 1, 0, 0 }, { 4, 0, 0 } },
                      { { 7, 8, 0 }, { 1, 2, 3 } } };
               
                int (*p)[2][3] = a3d;
        printf("输出结果为:%dn",*(*(*(p+1)+1)+1) );
        return 0;
}

输出结果为:2

*(p+1) 代表当前a[0][0][0]加到a[1][0][0]
*

单个++访问也可


        int a[2][2][3] = {1,2,3,4};
        int *p = &(a[0][0][0]);
        //
      
        /* for(int i = 0; i < 2*2*3; i++)
                *(p+i) = i; */
      
        printf("a[][][]的值为:%dn", *(p+(0*3 + 0*3 + 1)));
      
        printf("===============n");
        for(int i = 0; i < 2*2*3; i++)
        printf("a[][][]的值为:%dn", *(p+i));
      

//编译提示warning,错误写法

        int a[2][2][3] = {1,2,3,4};
        int *p = a;
        printf("a[][][]的值为:%dn", *(p+(0*3 + 0*3 + 1)));
      
        printf("===============n");
        for(int i = 0; i < 2*2*3; i++)
        printf("a[][][]的值为:%dn", *(p+i));
举报

更多回帖

发帖
×
20
完善资料,
赚取积分