请教:extern是否重新分配地址,

2020-01-20 19:03发布

同事离职,接手其工作,C文件有个接收数组,

1:
主程序 定义: unsigned char   receive_sbuf[8] ;
子程序 定义  extern unsigned char   receive_sbuf[8] ;

此时,该系统与上位机通讯正常。

2:
后来我将所有的函数整合成一个大函数,因为疏忽,在大函数中同时有
unsigned char   receive_sbuf[8] ;
extern unsigned char   receive_sbuf[8] ;
两个定义,编译器不报警,系统正常工作。

3:
后来将 extern unsigned char   receive_sbuf[8] ; 删掉,此时通讯不正常。

最重要的是:  在接收数据时,不限制接收字节数量,并且有  if(receive_sbuf[14] >0x12)  这样的判断条件,在1、2情况下正常  在3的情况下就不正常。

编译环境 :keil 4.72.9.0   单片机  stc12c5a60s2
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
enthier
1楼-- · 2020-01-20 20:44
对于一般的编译器,全局和局部同名的话,在函数内部会先引用局部变量。
兄弟会十戒之首
2楼-- · 2020-01-20 20:48
楼上说的对,对于extern关键字,只是作为声明这个变量是别的文件中定义的,并没有非配内存给它.同时,你在你在子函数中的同名变量,默认会覆盖掉extern修饰的变量,所以不会报错.如果是全局作用域的变量你也弄同样的名字,那估计会出现命名错误.你试试看
error_dan
3楼-- · 2020-01-20 23:48
 精彩回答 2  元偷偷看……
gshuang1
4楼-- · 2020-01-21 00:06
你的程序会完全不按照你的设想跑,数组越界访问会篡改其他变量的值,这是个大灾难。跟删不删除etern没关
unnormal
5楼-- · 2020-01-21 04:50
学习了

一周热门 更多>