这是变量生命周期引起的吗?

[复制链接]
3251|9
 楼主| effx 发表于 2011-1-14 07:36 | 显示全部楼层 |阅读模式
有3个程序文件:main.c , a.c , a.h。a.h是a.c的头文件,main.c包含a.h。
在a.c的函数中定义了一个局部变量,然后把这个变量的地址传给main函数,main函数需要读这个变量的值,结果却是程序不能按我想的那样运行。后来我把这个变量定义在a.h中,程序就按我想的那样运行了。
想请教下大家这是变量的生命周期引起的问题吗?
ayb_ice 发表于 2011-1-14 08:29 | 显示全部楼层
上程序
nevsayno 发表于 2011-1-14 08:44 | 显示全部楼层
1 变量不要定义在头文件中。
2 局部变量位于栈上,函数退出时变量无效。
HWM 发表于 2011-1-14 08:49 | 显示全部楼层
re LZ:

就是“变量生命周”所致。但不建议将变量的实体定义放在头文件中。因为如此若多模块引用头文件的话,会导致变量的重复定义。
SLEET1986 发表于 2011-1-14 08:55 | 显示全部楼层
1# effx
是的,典型的生命周期。可以把变量声明在头文件,在源程序里面定义变量--局部变量是在栈空间上的,退出函数就消失了--
ayb_ice 发表于 2011-1-14 09:36 | 显示全部楼层
局部变量是否分配在堆栈中这取决于具体的编译器
只能说一般是分配在栈中,但大多数低端的8位机并不是分配在栈中,比如C51(也可以分配在栈中),PICC用于PIC16及以下的MCU....
刘前辈 发表于 2011-1-14 11:18 | 显示全部楼层
本帖最后由 刘前辈 于 2011-1-15 19:23 编辑

局部变量bbb的生命周期仅在本函数F1(),随着F1函数的退出,bbb生命结束,它是被编译器分配在动态存贮区——由程序所有子函数共享、可覆盖的。所以bbb随F1退出后,bbb的地址就会被其它函数局部变量占有(共享,覆盖)。因此,bbb 需要在生命周期结束之前,将地址或数值传递给需要它的其他函数,这是局部变量的返回参数传递的问题,解决很简单:
int F1( );    // 说明为extern 函数。
main( )
{
int   aaa;     // 局部变量。
……
aaa = F1( );            // 这样达到 aaa=bbb ;  目的。
……
}
//*******************************
ac.c
#include "a.h"

int  F1( )
{
int  bbb;    //   可覆盖的局部变量。
……
return ( bbb );
}


把 bbb 定义到a.h 内,之所以可行,是因为这样就把bbb 定义为全局变量了。全局变量是静态分配,具有文件作用域,全程序中不可覆盖的。

如果玩得好,还可以(在编译还是连接程序中)把bbb 说明为不可覆盖的NoOver..Able。

 楼主| effx 发表于 2011-1-14 12:36 | 显示全部楼层
哦,知道了。谢谢大家。
晚上再看看书。
xc_2010 发表于 2011-1-15 15:16 | 显示全部楼层
谢谢楼主提醒!
xc_2010 发表于 2011-1-15 15:22 | 显示全部楼层
谢谢楼主提醒!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

166

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部