为什么局部变量的初始值没有定义呢.

winner8080 2010-07-07 04:48:39
不要告诉我这是规定,
编译器既然不像对待全局变量和静态变量那样让他=0,都是有原因的.


我想知道编译器到底怎么想的,
他不对局部变量做初始化有什么好处呢,做了又有什么坏处呢.
...全文
1116 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 winner8080 的回复:]
引用 18 楼 zhao4zhong1 的回复:

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)


你能举个例子吗.

这句话看的太多了.
[/Quote]
以下内容是从TD界面截屏得到的
  int G;
> int main() {
int L;
G=1;
L=2;
return 0;
}


_main: int main() {
cs:02C2>55 push bp
cs:02C3 8BEC mov bp,sp
cs:02C5 83EC02 sub sp,0002
#GL#4: G=1;
cs:02C8 C7068C020100 mov word ptr [_G],0001
#GL#5: L=2;
cs:02CE C746FE0200 mov word ptr [bp-02],0002
#GL#6: return 0;
cs:02D3 33C0 xor ax,ax
cs:02D5 EB00 jmp #GL#7 (02D7)
#GL#7: }
cs:02D7 8BE5 mov sp,bp
cs:02D9 5D pop bp
cs:02DA C3 ret
winner8080 2010-07-14
  • 打赏
  • 举报
回复
楼上的大哥,我都已经结贴了,
没法给你分数了.
fcly1981826ly 2010-07-13
  • 打赏
  • 举报
回复
学习来了。
lazy_2010 2010-07-13
  • 打赏
  • 举报
回复
问题就提出得有点问题吧,全局变量不一定初始化为 0 的,可以有未初始化的全局变量的;

不自动清 0 当然是为了效率问题,你每个函数都加一个 memset 试一试看,效率很低的。
richbirdandy 2010-07-13
  • 打赏
  • 举报
回复
不想研究这个问题。。。各位继续。。
tzcherish 2010-07-13
  • 打赏
  • 举报
回复
学习了~
天亮后说晚安 2010-07-13
  • 打赏
  • 举报
回复
xuexi来了
brookmill 2010-07-12
  • 打赏
  • 举报
回复
局部变量的地址,编译的时候不可能知道的。
x86的局部变量都在栈上,通常是栈指针的一个偏移量,ebp-n
每次运行的时候,栈指针都不一定一样,所以只有到了运行的时候、进入了这个函数,才知道局部变量的地址
winner8080 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 shrek_mycpp 的回复:]

看了那么多回复。我觉得还是有必要补充一下。
首先程序作为一个内核对象,操作系统给它分配了不同的空间,用于存储不同类型的数据,当然还有它本身的代码区等。这里我只关心数据区。全局变量和局部变量的空间位置完全不同。它们的'初始化'也是在完全不同阶段。全局变量的初始化类似于格式化的过程,在预处理阶段已经进行,对于操作系统来说,这种操作准确且简单快捷。而局部变量的'初始化'是在程序运行期进行的,楼上有的……
[/Quote]

不错.
再没人回复就结贴了.这个帖子要加分了.呵呵.
baihacker 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 brookmill 的回复:]
局部变量的地址,编译的时候不可能知道的。
x86的局部变量都在栈上,通常是栈指针的一个偏移量,ebp-n
每次运行的时候,栈指针都不一定一样,所以只有到了运行的时候、进入了这个函数,才知道局部变量的地址
[/Quote]
这点是事实,但是不能推出局部变量不自动初始化的结论。
ForestDB 2010-07-12
  • 打赏
  • 举报
回复
其实就是个规定,至于为什么有这个规定,需要考古,才能完全理解当初的设计哲学。
dream17953 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 winner8080 的回复:]
引用 3 楼 codesnail 的回复:

因为局部变量要被分配在栈上,因为地址不确定,怎么分配初值?


分配在栈上,
在分配的时候就知道地址了啊.
怎么不能给初值呢
[/Quote]


分配在栈上的变量应该是在运行的时候才分配地址的。
aozhi 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 winner8080 的回复:]
引用 38 楼 brookmill 的回复:

局部变量的地址,编译的时候不可能知道的。
x86的局部变量都在栈上,通常是栈指针的一个偏移量,ebp-n
每次运行的时候,栈指针都不一定一样,所以只有到了运行的时候、进入了这个函数,才知道局部变量的地址


对全局变量,静态变量赋初值难道是编译器干的?
正如楼上2位所说,局部变量的地址在编译的时候还不知道,所以编译器无法赋值.

……
[/Quote]

编译器确定了逻辑地址
OS的分段机制确定了线性地址
分页机制确定了物理地址。
winner8080 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 brookmill 的回复:]

局部变量的地址,编译的时候不可能知道的。
x86的局部变量都在栈上,通常是栈指针的一个偏移量,ebp-n
每次运行的时候,栈指针都不一定一样,所以只有到了运行的时候、进入了这个函数,才知道局部变量的地址
[/Quote]

对全局变量,静态变量赋初值难道是编译器干的?
正如楼上2位所说,局部变量的地址在编译的时候还不知道,所以编译器无法赋值.

之前还真没想到这点
pengzhixi 2010-07-12
  • 打赏
  • 举报
回复
局部变量是运行时期的地址才知道,这个时候如果你编译器增加初始化无疑增加运行时期的成本,而且,编译器给的初始值是否合法也是一个问题
winner8080 2010-07-12
  • 打赏
  • 举报
回复
通过一个问题,引出这么多.学习了.
谢谢各位.
durant 2010-07-12
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
algorithms_memo 2010-07-12
  • 打赏
  • 举报
回复
效率。。
局部变量栈地址是运行时确定的,初始化需要耗费cpu时间。
而全局和静态变量在编译器确定,因此设置默认初始值。
winner8080 2010-07-12
  • 打赏
  • 举报
回复
我怎么给这个帖子追加分数,
要不结贴的时候分数太少了.
加载更多回复(38)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧