单片机学习小组
登录
直播中
刘桂兰
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));
数组下标越界访问却不报错,正常运行??
//初始化定义程序:
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));
举报
更多回帖
rotate(-90deg);
回复
相关问答
数组
编译器
关于
c
语言
中
数组
下标
的加减平移知识点总结不看肯定后悔
2021-10-14
2069
数组
的
越界
访问
可能会导致什么情况?
2023-10-09
178
这个芯片的原理图库, 在validate changes的时候,
却不报错
2015-01-13
5641
四层板 死铜了,但检测时
却不报错
是什么原因
2015-02-10
3876
在使用和
访问
数组
的时候需要注意些什么地方?
2023-10-10
202
如何使用单片机的
C
语言
中的
数组
?
2021-10-15
1204
不同编译器的
C
语言
,vc++和keil
不报错
2020-03-05
1190
数组
下标
可以为负数吗 ?
2023-09-26
222
请问怎么设置短路
不报错
?
2019-08-06
2734
对于一个
数组
为什么
越界
使用会导致MCU的程序跑飞呢?
2023-10-13
291
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分