打印

初学C,请教大虾们一个小问题,举手之劳!谢谢

[复制链接]
2507|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guwengchuixue|  楼主 | 2011-8-9 20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于现在板不在手上,使用stm32f103ve。突然想到个问题,关于数组问题。
如:
char arry[10] = {2};
char a = 0;

a = arry[11];
这样算越界吗,会产生硬件错误导致死机吗?

又如:
char arry[10] = {2};
char b = 0;
char fun(char * Tmparry)
{
     char a = 0;
     a = Tmparry[11];
     return a;
}

b = fun(arry);
这样算越界吗,会产生硬件错误导致死机吗?

在线等,谢谢!
沙发
guwengchuixue|  楼主 | 2011-8-9 21:13 | 只看该作者
无人回答。。。。。。。。。。。。

使用特权

评论回复
板凳
729144646| | 2011-8-9 22:41 | 只看该作者
计算机找不到,之后会说调试错误,对吧?

使用特权

评论回复
地板
guwengchuixue|  楼主 | 2011-8-9 22:47 | 只看该作者
两种情况都一样的吗

使用特权

评论回复
5
styeven| | 2011-8-10 08:49 | 只看该作者
b = fun(arry);
这样写不对。
应该写成b = fun(&arry);
因为你前面定义的是指针、

使用特权

评论回复
6
styeven| | 2011-8-10 08:50 | 只看该作者
a = arry[11];
你定义的本来就是10个数 哪来的arry[11];
arry[10]也都不对。最多arry[9];
是从0开始计数,到9刚好10个数。
建议你去看看C语言的数组。

使用特权

评论回复
7
12812ty| | 2011-8-10 08:57 | 只看该作者
5# styeven
数组名不就是数组的首地址么

使用特权

评论回复
8
batsong| | 2011-8-10 10:33 | 只看该作者
读取越界没关系,写入数组越界很容易搞死机

使用特权

评论回复
9
yinyangdianzi| | 2011-8-10 11:07 | 只看该作者
路过

使用特权

评论回复
10
mohanwei| | 2011-8-10 11:20 | 只看该作者
读越界也有可能,因为有的地方是不能随便读的(有的一读就自增——如FIFO,还有的一读就自动清零),特别是有MMU的时候

使用特权

评论回复
11
ZigBee笔记| | 2011-8-10 21:40 | 只看该作者
越界,这是不合法操作,别乱来,老实点。

使用特权

评论回复
12
hgjinwei| | 2011-8-11 07:27 | 只看该作者
这个确实越界了,但还不至于导致挂机,这点越界还不至于跑出内存区。
如果arry是临时变量,最多读读堆栈中的返回地址;
而如果arry是全局变量,那顶多也就读读a变量后面的那个地址,根据ARM堆栈的增长方向,全局变量是从低地址开始分配,高地址还有堆栈。
但如果是写操作,那就悲剧了:
1、可能将返回地址给刷掉,然后程序跑到一个异次元空间;
2、可能修改其他变量的值,当然,能修改其他变量还是好事,至少可以很快知道BUG所在,最怕此处不会修改其他变量,程序运行很“正常”,而一旦移植到其他地方,就挂机了。于是,你就拼命地去找其他地方的BUG,却没想到问题出现在你认为“非常正常”的这段程序;

总结:如无必要,不要轻易出轨。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Ryanhsiung + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

53

帖子

0

粉丝