返回信息流如题:
#include<stdio.h>
void a()
{
int i;
printf("%d\n",i);
i = 99;
printf("%d\n",i);
}
void main()
{
a();
a();
}
输出为啥是
4200178
99
99
99
第三行和第四行为什么都是99,不明白
这是一条镜像帖。来源:北邮人论坛 / cpp / #82509同步于 2014/9/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
菜鸟关于函数调用的困惑,题目见正文
enjoyde
2014/9/17镜像同步95 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
求一个未初始化的变量的值是“未定义行为”(undefined behaviour)。从什么也不发生到机器冒烟都有可能发生。所以你的结果纯属巧合。
【 在 du5307 的大作中提到: 】
: 第三行的99和第一行的4200178都是一切皆有可能么…我对ls的理解…
: 通过『我邮2.0』发布
嗯。可以这么说吧。其实计算机冒什么颜色的烟也都是有可能的。
至于第二个输出值和第三个值“冒了同样颜色的烟”,是因为机器烧毁的器件的材质相同:
两次call a()的堆栈结构完全相同且连续执行,栈中的值未被修改就重新printf。
【 在 nuanyangyang 的大作中提到: 】
:
: 嗯。可以这么说吧。其实计算机冒什么颜色的烟也都是有可能的。
同意。。还是那块内存,所以值没变
【 在 tonyjansan 的大作中提到: 】
: 至于第二个输出值和第三个值“冒了同样颜色的烟”,是因为机器烧毁的器件的材质相同:
:
: 两次call a()的堆栈结构完全相同且连续执行,栈中的值未被修改就重新printf。
: ...................
发自「贵邮」
首先 第一行乱码你懂得 然后这个变量是分配到栈里面的 所以你把值写成99后 改栈空间的地址的值变成了99 然后程序调用结束 栈空间释放该变量 回收内存 栈顶回滚到上一步 。再次调用该函数“恰巧”从那个地方分配 然而那儿的值已经变成99了 所以是99 一般情况是这样的 。程序运行时会分配一块栈空间给你 所以程序结束前这儿不会被其他程序使用 如果你在两个a()之间调用了其他分配栈空间的东西 你的值就不是99了
发自「贵邮」