变量命名引起的血案

问题描述:在使用函数指针的时候发现不能正确执行该函数,具体表现就是在线调试时不能进入该函数执行。那么是什么问题导致的呢?

stLED_Info[1].funSet_LedState(LED_ON);  //希望执行的代码

这一条语句涉及结构体、数组、函数指针、函数指针的调用问题,比较复杂。

首先怀疑C语言语法理解有误,使用错误的写法导致不能进入该函数,所以上网查找函数指针的用法,但是没有找到结构体中套函数指针并且该变量被声明成了一个数组的调用方式,然后又采用分步写的方式进行函数的调用,发现还是失败,如下:

                       

这里的第一步

volatile stLED_InfoType *stLED_Infom = stLED_Info; 中的 stLED_Info 本意是传全局变量,即如下结构体数组变量:

后来才发现这里传入的其实是局部指针变量stLED_Info

在这里全局变量已经自动被屏蔽了。

此次分步写测试也失败之后,在另一个子函数中采用之前同样的写法,却发现可以正常执行。如下:

却没明白为什么能正常执行(现在想来就是这个子函数里没有局部变量stLED_Info,所以里面的stLED_Info就是全局变量,也就不会出现问题了),想通过汇编程序直接找到问题所在,但是发现汇编水平很菜,放弃,也想通过生成的map文件查看变量真正的地址在哪,也发现对map文件不熟,后来通过 Memory窗口直接查看该变量地址的内容,也没有研究出什么东西。

后来在使用Watch窗口查看变量时又发现一个问题,当在程序还没有执行的时候,Watch窗口显示只是一个结构体变量,但是当执行到使用该变量的函数体时,再将变量复制到Watch窗口时,发现变成了一个结构体数组变量。而这个才是我真正想查看的变量才是。为什么没有执行到该函数时就显示不正常呢?是KEIL软件的问题吗?然后各种程序运行暂停测试发现都是如此,好像该变量一下子变成了结构体数组,一下子又变成了单独一个结构体,一下子这个单独的结构体显示没有数值,显示为空白。这样一来,彻底糊涂了。

主函数也声明了一个局部变量stLED_Info,用于传递参数使用。

调用的函数也使用了该函数名作为传递的指针变量

通过Set_LedPara局部变量的查找可以看到如下:stLED_Info存放的地址是0x20008558,局部变量自身的地址目前无法确定。并且可以看到主栈的地址为0x20008540。很大可能就是该局部变量指针存放的地址也是局部变量,而从前面可以知道,主函数其实也申明了一个局部变量stLED_Info。所以这样一来就很乱了。但是KEIL不慌,它清醒着呢!

看如下,一个局部变量消失之后,我们真正要查看的全局变量终于出现了,原来他的地址是0x2000814C,但是那个局部变量的函数指针指向的函数又是什么鬼,没见过啊,自己更没写过。这就要涉及进入C语言环境之前做的一些处理工作了。以后再好好分析一下。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 2
关注 151
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧