5275|12

308

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

请教:数组溢出 [复制链接]

假设定义一个数组
unsigned char a[32];
unsigned char i=0;

void add(void)
{
        a=10;
        i++;
}

如果 一直执行这个函数,当i的值大于等于32的时候,数字将会存到哪个单元里面去,会不会覆盖其余的数据?


[ 本帖最后由 xiaojiong886 于 2013-3-11 10:16 编辑 ]
此帖出自编程基础论坛

最新回复

  详情 回复 发表于 2014-4-30 16:28
点赞 关注
 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
i这个值再大又怎样?
你压根没用这个值,只是不断叠加

a= 10;
这是什么?
不会报错才怪?

数值地址可以赋值么?
此帖出自编程基础论坛
 
 
 

回复

308

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

回复 沙发 辛昕 的帖子

不好意思,写错了
是 a,是数组不是一个a.....
此帖出自编程基础论坛
 
 
 

回复

308

帖子

0

TA的资源

纯净的硅(中级)

4
 

回复 沙发 辛昕 的帖子

原来不是我没写的问题,是更本打不出来
a【i】
此帖出自编程基础论坛
 
 
 

回复

308

帖子

0

TA的资源

纯净的硅(中级)

5
 

回复 沙发 辛昕 的帖子

这个是临时写的,不是报错,我就想知道,在单片机里写的时候,如果超过这个值,比如说
i=32;
那么a[32]单片机内将会怎么处理,是否会覆盖掉其他数据的存储位置。。。。
此帖出自编程基础论坛
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

6
 
原帖由 xiaojiong886 于 2013-3-11 10:22 发表
这个是临时写的,不是报错,我就想知道,在单片机里写的时候,如果超过这个值,比如说
i=32;
那么a[32]单片机内将会怎么处理,是否会覆盖掉其他数据的存储位置。。。。

i = 32,a[32]指向的是这个数组末尾紧接着的一字节空间,如果读它不会有破坏原来的数据,但是如果去写它,那么就覆盖了它,会有导致出问题的情况。C语言对这个数组边界超界是不做检查的,完全由程序员来注意这个问题,因为有时也有一些很特殊的技巧会用到它。

强烈建议楼主自己连上调试仿真器来看,你想做的操作是怎么执行的,看能不能验证自己的想法。

自己一试就什么都知道,靠别人说始终都不会理解得很深的。
此帖出自编程基础论坛
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 5楼 xiaojiong886 的帖子

数组越界了.  就看你越界的那个位置是不是存有有效的数据了. 如果没有的话, 就将(a+10)地址内的数据赋为10. 运行不会出错.
如果存有程序使用的数据, 会覆盖掉有用的数据, 就会出错.
而且C编译器并不对你操作的数组边界进行检查.
和野指针一个道理.

[ 本帖最后由 KISSMonX 于 2013-3-11 02:40 编辑 ]
此帖出自编程基础论坛
 
 
 

回复

308

帖子

0

TA的资源

纯净的硅(中级)

8
 

回复 6楼 lr2131 的帖子

谢谢,我修改程序后,问题解决了,主要是在现场出了点问题,家里又没条件测试,所以,我怀疑是数组溢出,覆盖了后面的数据,现在让现场人员重新烧写后正常工作了,验证了我的想法。。。。原来是按顺序下去覆盖的,我猜测会覆盖,但具体不知道按什么规律覆盖的
此帖出自编程基础论坛
 
 
 

回复

308

帖子

0

TA的资源

纯净的硅(中级)

9
 

回复 7楼 KISSMonX 的帖子

嗯,谢谢,我在编译器里面看了数据存储的区域,然后结合,出错部分,就猜测是数组溢出覆盖了,写的时候没考虑那么周详,谢谢指导
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

10
 
两个点

c是允许通过地址操作内存的。
你所说的覆盖规律其实很简单,很恐怖的简单  
不管你是那种操作,最后它会非常忠实地按照你的操作背后的二进制结果改写内存,不加任何区别保护
所以你可以通过看到的数据猜测到是越界覆盖,但是,如果,你操作的是浮点数,事情就复杂多了,因为浮点球的二进制是很难一眼看出来的。

第二点
所谓的相邻空间是什么空间

首先要说明,数组越界并不仅仅限于它附近很近的空间里,如第一点所写,你偏了多远,它就能窜到多远,所以在pc上越界时常有警告读写异常,在单片机裸机上就没那么好运了,我个人试过最大条的是直接导致死机,不复位就卡着不动

回到正题,那一般情况下写到附近的空间,这些都是什么空间呢?

首先要理解不同变量在空间上的位置分配
局部变量在堆棧上,他们会出什么问题由于我对这一块的机制尚未摸熟,不好说,但他们显然会破坏进出函数的现场保护和回复状态

而如果是静态变量,或者全局变量,它们一般是在固定的空间永久保存,而且排列是有一定顺序的,就是按照定义的先后顺序,按照不同源文件先后编译顺序,按照从前到后或者反过来的顺序一顺排列

如果你想知道具体位置可以查看编译后生成的map文件。

所以这就提示我们,但发现覆盖时,从它附近的变量和源文件着手定位
此帖出自编程基础论坛
 
 
 

回复

308

帖子

0

TA的资源

纯净的硅(中级)

11
 

回复 10楼辛昕 的帖子

谢谢,我编译器用的CVAVR,在编译器里面可以看到每个全局变量存放的地址,我记得上次是应该覆盖了状态位,然后不在规定状态,我就会让程序复位。。。,我用的是全局变量,貌似是一直往下存放的
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

12
 

回复 11楼xiaojiong886 的帖子

哦,无所谓,反正都可以看到
看不到就看map。
此帖出自编程基础论坛
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

13
 
lr2131 发表于 2013-3-11 10:29
i = 32,a[32]指向的是这个数组末尾紧接着的一字节空间,如果读它不会有破坏原来的数据,但是如果去写它, ...


此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表