打印

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

[复制链接]
1978|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:

就是“变量生命周”所致。但不建议将变量的实体定义放在头文件中。因为如此若多模块引用头文件的话,会导致变量的重复定义。

使用特权

评论回复
5
SLEET1986| | 2011-1-14 08:55 | 只看该作者
1# effx
是的,典型的生命周期。可以把变量声明在头文件,在源程序里面定义变量--局部变量是在栈空间上的,退出函数就消失了--

使用特权

评论回复
6
ayb_ice| | 2011-1-14 09:36 | 只看该作者
局部变量是否分配在堆栈中这取决于具体的编译器
只能说一般是分配在栈中,但大多数低端的8位机并不是分配在栈中,比如C51(也可以分配在栈中),PICC用于PIC16及以下的MCU....

使用特权

评论回复
7
刘前辈| | 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。

使用特权

评论回复
8
effx|  楼主 | 2011-1-14 12:36 | 只看该作者
哦,知道了。谢谢大家。
晚上再看看书。

使用特权

评论回复
9
xc_2010| | 2011-1-15 15:16 | 只看该作者
谢谢楼主提醒!

使用特权

评论回复
10
xc_2010| | 2011-1-15 15:22 | 只看该作者
谢谢楼主提醒!

使用特权

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

本版积分规则

0

主题

166

帖子

2

粉丝