求高手解释下!

longx_ok 2010-04-17 04:02:07
今天看到一个很简单的函数调用的例子,但结果并不是我想的那样,望高手解释下,谢!
[size=11px]#include <stdio.h>
int foo()
{
int i;
printf("%d\n",i);
i=777;
}

int main()
{
foo();
foo();
return 0;
}打印出来的第一行是一个随机数,但第二行却是777,这里有个疑惑,函数调用结束后,值不是被释放了吗?为何第2行的是777?
************************************************************************************
#include <stdio.h>
int foo()
{
int i;
printf("%d\n",i);
i=777;
}

int main()
{
foo();
printf("haha\n");
foo();
return 0;
}
结果又不一样了,第二次调用函数输出的结果是0了,这是为什么呢?望高手给予解释,本人也查阅了相关书籍,跟那个栈什么的貌似有关,给俺解释下 ,再谢!!!
...全文
112 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
longx_ok 2010-04-21
  • 打赏
  • 举报
回复
呵呵,这是在一个电子档上看到的例题,觉得蛮有意思的,就是第二个输出没弄明白,谢谢高手的指点,现在貌似有点懂了,就是栈,堆的不同。但是没有初始化给出的不应该是随机值吗?为什么第二个给出的却是777.根据7楼的解释,第一个程序中第一次是分配的随机数,在栈上重新赋值i=777后,第二次就会直接分配栈上的i值?可以这样理解吗?
cattycat 2010-04-20
  • 打赏
  • 举报
回复
未初始化的输出的值是随机的。你第一个第二次仍然是777是因为函数退出后栈清除并不是栈上写0,所以printf出来的是777,但不保证其他电脑或编译器也是这个值。第二次不是777,是因为你printf一下,栈的值被重写了。

你纠缠这个毫无意义,使用变量的时候要初始化。
ForestDB 2010-04-20
  • 打赏
  • 举报
回复
帮顶。
huanmie_09 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fox000002 的回复:]
首先,未初始化就使用临时变量,这是不合法的

lz 说的现象,可以研究一下对应的汇编代码
[/Quote]
up!
注意变量使用前需要初始化.
  • 打赏
  • 举报
回复
为什么要星空缓冲区呢?如果缓冲区是在栈里分配的话是不需要清除的,因为系统会帮你做这个工作,但是如果缓冲区是分配在堆里的话就要自己手动清除了,不然会发生内存泄露,就是虽然不使用,但占用的资源却不能被释放... ...

fflush(stdin);清空输入缓冲区
fflush(stdout);清空输出缓冲区
longx_ok 2010-04-17
  • 打赏
  • 举报
回复
望各位高手能给我讲讲关于这方面的知识点,尤其是关于栈,堆,还有2楼说的那个fflush,谢谢!
pengzhixi 2010-04-17
  • 打赏
  • 举报
回复
未初始化的变量什么值都有可能。
zcphoenix 2010-04-17
  • 打赏
  • 举报
回复
楼上正解!
aizibion 2010-04-17
  • 打赏
  • 举报
回复
栈上空间被回收并不代表值被清除,再次使用该空间的时候,如果不初始化,获取的值也就是上一次遗留的值

第二个,栈空间被临时变量“haha\n”再次利用后,原来那个777已不存在
  • 打赏
  • 举报
回复
难道是没有清空输出缓冲区的问题?

你试试fflush(stdout);
fox000002 2010-04-17
  • 打赏
  • 举报
回复
首先,未初始化就使用临时变量,这是不合法的

lz 说的现象,可以研究一下对应的汇编代码

69,371

社区成员

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

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