数组下标越界访问却不报错,正常运行??
//初始化定义程序:
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("输出结果为:%d\n", a[1][2]);
printf("输出结果为:%d\n", a[1][0]);
printf("输出结果为:%d\n", a[1][1]);
printf("输出结果为:%d\n", a[1][3]);
printf("输出结果为:%d\n", a[0][3]);
printf("输出结果为:%d\n", a[0][2]);
return 0;
}
输出结果都为0
多维数组
int main ()
{
int a[3][4][3] = {{{1,2}}, {{1}}, {4, 6, 8}};
printf("输出结果为:%d\n", a[1][0][0]);
printf("输出结果为:%d\n", a[5]);
return 0;
}
#include <stdio.h>
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("输出结果为:%d\n",*(*(*(p+1)+1)+1) );
return 0;
}
输出结果为:2
*(p+1) 代表当前a[0][0][0]
加到a[1][0][0]
*
http://c.biancheng.net/view/2022.html
单个++访问也可
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[][][]的值为:%d\n", *(p+(0*3 + 0*3 + 1)));
printf("===============\n");
for(int i = 0; i < 2*2*3; i++)
printf("a[][][]的值为:%d\n", *(p+i));
//编译提示warning,错误写法
int a[2][2][3] = {1,2,3,4};
int *p = a;
printf("a[][][]的值为:%d\n", *(p+(0*3 + 0*3 + 1)));
printf("===============\n");
for(int i = 0; i < 2*2*3; i++)
printf("a[][][]的值为:%d\n", *(p+i));