打印

大家分析下这种情况会有什么危害

[复制链接]
3738|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
e08610318|  楼主 | 2012-10-18 17:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本菜鸟用C写的单片机程序,定义了一个结构体,成员包含指向函数的指针。结果在程序运行前,忘记初始化这个指针了,而且程序中使用了该指针,即通过它来运行某个函数。最后的结果是系统不断被看门狗复位,应该是程序跑飞了。
    我们知道,没有初始化的指针是一个野指针,而这个值被赋给PC后,程序就会跳到未知的地方。
请问:
    1.请简要分析下这种情况所造成的后果;
    2.请问PC是否会指向数据区而不是代码区,如果会指向数据区,则结果会如何
    3.如果该指向函数的指针初始化时被赋值为NULL,而最后仍然会调用它来试图运行一个函数,这样会产生什么样的结果?

相关帖子

沙发
NE5532| | 2012-10-18 17:20 | 只看该作者
按规矩做事,不按规矩不要去问为什么,把精力放在正确的方向上。就像耗子药不能吃一样。

使用特权

评论回复
板凳
e08610318|  楼主 | 2012-10-18 19:03 | 只看该作者
2# NE5532
谢谢你的建议,但是我就是想知道耗子药是怎么毒死人的

使用特权

评论回复
地板
NE5532| | 2012-10-18 19:10 | 只看该作者
楼主的思想是初学者常犯的错误,那你没必要在自己身上试吧。

使用特权

评论回复
5
sfesdm| | 2012-10-18 20:11 | 只看该作者
函数也有地址,你在运行时,如果把函数地址赋给指向函数的指针,那肯定是不会有错的。
但如果你有类似如下的操作:
int (*fp)(...);
int a;
a = fp();就会产生不可预料的错误。
对于你的3个问题,个人见解如下,如有错误,也请后面的大侠指正。
1、产生的错误不可预料。
2、是否会指向数据区,要看存储器结构。例如51的哈佛结构,程序存储区跟数据存储区分开,自然不会指向数据存储区了。
3、如果指针赋值NULL,其实NULL的值为0,当调用这个指向函数的指针所指的地址时,PC会从0地址开始运行,这样是不是相当于进行了复位操作呢?

使用特权

评论回复
6
NE5532| | 2012-10-18 21:17 | 只看该作者
楼主实在感兴趣,可以研究一下函数指针的反汇编,在汇编面前,没有任何数据格式,你就知道指针为什么会飞了。

使用特权

评论回复
7
李冬发| | 2012-10-19 02:07 | 只看该作者
LZ提的几个问题,不可能有答案。
原因是,你没说什么平台、没说是什么MCU,不可能有答案。

使用特权

评论回复
8
cool_coder| | 2012-10-19 10:09 | 只看该作者
是不是老师留的作业,到这里找作案来了?

使用特权

评论回复
9
e08610318|  楼主 | 2012-10-19 10:28 | 只看该作者
7# 李冬发
msp430f249

使用特权

评论回复
10
e08610318|  楼主 | 2012-10-19 10:30 | 只看该作者
5# sfesdm
感谢分析。我现在用的是mspf249,有时间我去研究下这个单片机的存储分布,到时候再去试试

使用特权

评论回复
11
e08610318|  楼主 | 2012-10-19 10:31 | 只看该作者
8# cool_coder
我今年刚本科毕业......
我最讨厌老师留作业........

使用特权

评论回复
12
e08610318|  楼主 | 2012-10-19 10:37 | 只看该作者
5# sfesdm
我自己的见解是,不管指向的是数据区还是代码区,程序就是按照指令执行的,不同指令对应一个2进制数值。单片机可能只管从某个内存区域提取出来的数值,至于它是否对应一个操作指令不得而知,因此这样的结果不可预料。

使用特权

评论回复
13
杞人不忧天| | 2012-10-19 11:49 | 只看该作者
按规矩做事,不按规矩不要去问为什么,把精力放在正确的方向上。就像耗子药不能吃一样。
NE5532 发表于 2012-10-18 17:20

民可使由之,不可使知之。在社会上遭到反对,在技术上遭到支持。
对技术而言,干十件正确的,不如干一件错误的收获更大。磨刀不误砍柴功,功利心让人忘记思考,民工的称谓名副其实,磨刀的性质发生了改变——等着盼着被洗脑。
不问为什么的这种想法,只适合于干重复性的工作,但愿重复性的工作机会永存。

使用特权

评论回复
14
mcu5i51| | 2012-10-19 13:19 | 只看该作者
结果一定未知,但是可以想办法增加一定的几率使芯片复位或停机;
编译器会对未经初始化的变量直接使用时发出警告,因此,必要忽略警告,至少要知道原因,可不可以忽略

使用特权

评论回复
15
半个苹果| | 2012-10-19 13:24 | 只看该作者
要看这个结构体是全局变量还是局部的
如果是全局变量,位于BSS段,初始化之后设为0
如果调用了这个函数,就会从0地址开始执行,一般0地址放置的是复位后的程序。就相当于你的程序被复位了。

使用特权

评论回复
16
NE5532| | 2012-10-19 13:43 | 只看该作者
民可使由之,不可使知之。在社会上遭到反对,在技术上遭到支持。
对技术而言,干十件正确的,不如干一件错误的收获更大。磨刀不误砍柴功,功利心让人忘记思考,民工的称谓名副其实,磨刀的性质发生了改变——等着盼 ...
杞人不忧天 发表于 2012-10-19 11:49

不是不问为什么,是不在错误的路上跟自己较劲,人从教训中总结经验,聪明人从别人的教训中总结,不聪明的,从自己身上总结。这就是道理。

使用特权

评论回复
17
uschon| | 2012-10-19 15:39 | 只看该作者
说得太好啦。 13# 杞人不忧天

使用特权

评论回复
18
uschon| | 2012-10-19 15:42 | 只看该作者
不是不问为什么,是不在错误的路上跟自己较劲,人从教训中总结经验,聪明人从别人的教训中总结,不聪明的,从自己身上总结。这就是道理。
NE5532 发表于 2012-10-19 13:43
不赞成你的观点的人就成了不聪明的人?

使用特权

评论回复
19
8980| | 2012-10-19 15:55 | 只看该作者
因为函数的指针和整体的结构不相符合,可以附加代码,或者删除指针重弄一个。  具体还得试了才知道

使用特权

评论回复
20
12分| | 2012-10-19 15:56 | 只看该作者
学习一下。这个还真不懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

310

帖子

12

粉丝