鱼C论坛

 找回密码
 立即注册
楼主: 090704020006

一道C语言的题目求解,不是求答案,是求解析

  [复制链接]
发表于 2012-10-29 21:36:27 | 显示全部楼层

他说的是存在很多子函数调用的情况,你只是在用这种可以说的特例的程序运行才会这样,正常是基本不可能的。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-29 21:36:30 | 显示全部楼层
090704020006 发表于 2012-10-29 21:32
忘了告诉你们我是在linux下才能得出书上的结果,还有我反复运行后 结果还是你所说中彩票几率的555,这是为 ...

什么编译器呢?GCC?
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-29 21:37:08 | 显示全部楼层
对 GCCcccccccccccc
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-29 21:39:43 | 显示全部楼层
不过还是谢谢你们,我刚学linux,我自己去多试试吧
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-29 21:42:26 | 显示全部楼层
  1. #include<stdio.h>
  2. int f()
  3. {
  4.     int i;
  5.     printf("%d",i);
  6.     i=555;
  7. }
  8. int main()
  9. {
  10.     f();
  11.     printf("\n");//1991577954hello1991675093
  12.     f();
  13. }
  14. //4200230555
复制代码
没加  pritnf("/n");  语句,得出结果是:4200230555
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-29 21:59:24 | 显示全部楼层
可能第一个F()的I的地址和第二个f()中的I的内存地址是一样的……
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-29 22:00:15 | 显示全部楼层
  1. #include<stdio.h>
  2. int f()
  3. { int i;       //此处i为局部变量,所以这个变量只是暂时存在于f()中。
  4. printf("%d",i);//此时i没有被赋初值,所以是个随机数,它显示的值跟系统有关
  5.   i=555;       //其实此时这个赋值对于本程序是没有用的,因为函数调用后就把它释放了
  6. }
  7. /*int main()
  8. {
  9. f();           //第一次调用后输出i值为随机数,然后i被释放
  10. f();           //第二次调用时因为上一次的i被释放,所以这时i仍然为随机数,输出还是随机的
  11. }
  12. 这会输出什么?

  13. 如果这样:*/
  14. int main()     //这个同理很容易得出结果,建议你研究一下局部变量
  15. {              //和全局变量的区别。还有就是静态变量和动态变量的区别
  16. f();
  17. printf("hello");
  18. f();
  19. }
  20. /*又会输出什么?
  21. 求解析*/
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-29 22:01:37 | 显示全部楼层
090704020006 发表于 2012-10-29 21:24
我其实想问的是,书上面为什么会写出这种答案?
第一个:
543453324

书上的也不是真理,还是自己单步调试一下吧,那样就清楚了!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-29 22:02:00 | 显示全部楼层
系统对内存的分配规律不一样吧……
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-30 21:41:23 | 显示全部楼层
空间微粒 发表于 2012-10-29 21:11
先看第一个:
  • # include

  • 赞一个,写代码就是要知道他是怎样在内存中运作的
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-30 22:07:36 | 显示全部楼层
    同意 空间微粒 的看法。两次都是垃圾值。:({:1_1:}
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-30 22:35:23 | 显示全部楼层
    其实这个吧,主要是看编译器的优化方法,楼主得出那个555是因为调用两次f(),i在堆栈的位置是一样的,第一次的垃圾i在调用后改为了555,而第二次则直接利用了这个垃圾。这东西只要调出反汇编看看,就知道内部实如何实现的了。
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-30 23:49:14 | 显示全部楼层
    空间微粒 发表于 2012-10-29 21:22
    两次操作系统给i分配的内存地址不一定是同一个地址,而且还有可能被其他程序占用,所以输出555的几率几乎 ...

    应该两次的地址是一样的,这个还存在个系统优化的问题,所以系统两次给分配的内存是同一段内存吧!
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-31 09:46:30 | 显示全部楼层
    编译不过得吧,你定义的函数里面 i没初始化 你就打印 i 。
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-31 10:14:22 | 显示全部楼层
    你这个题,第一个:第一次输出 i 因为变量 i 没有赋值,所以输出的是 i 本身的垃圾值,输出后从新给 i 赋值 。调用完后,释放 f()的内存空间!这第二次输同样是一个i的垃圾值,之前的赋值的 内存空间已被释放! .但是第一个输出跟第二个输出没有用空格或换行符格开,所以都连在一起!      第二个:同样第一个输出原理同上,只是两个垃圾值的中间加了 hello, 解说完毕!
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-31 12:03:59 | 显示全部楼层
    学习,不容易啊。
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-31 12:29:11 | 显示全部楼层
    是你电脑上没编译器还是你不想动手?
    程序是由上到下顺序执行的,所以第一个会输出乱码
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-31 13:59:35 | 显示全部楼层
    学习了 ,,,,,,
    小甲鱼最新课程 -> https://ilovefishc.com
     楼主| 发表于 2012-10-31 20:21:47 | 显示全部楼层
    经过我调试,反正GCC编译器和VC结果不同, vc中函数变量放到栈里,感觉GCC编译是把函数中的变量放到了静态区
    小甲鱼最新课程 -> https://ilovefishc.com
    发表于 2012-10-31 20:30:13 | 显示全部楼层
    这个问题和C语言没什么关系,要熟悉汇编语言里调用函数的时候栈的变化(局部变量存储在栈上)。C语言是先编译为汇编语言,再进一步编译成目标文件的。
    小甲鱼最新课程 -> https://ilovefishc.com
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

    GMT+8, 2025-11-16 02:11

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表