鱼C论坛

 找回密码
 立即注册
查看: 7490|回复: 43

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

  [复制链接]
发表于 2012-10-29 18:52:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int f()
{ int i;
printf("%d",i);
  i=555;
}
int main()
{
f();
f();
}
这会输出什么?

如果这样:
int main()
{
f();
printf("hello");
f();
}
又会输出什么?
求解析
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-29 19:52:06 | 显示全部楼层
请添加代码的时候用这种方式

复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-29 20:14:04 | 显示全部楼层
#include "stdio.h"
int f()
{ int i;
  i=555;
  printf("%d",i);
  
}
void main()
{
f();
f();
}
输出 555555

第二个输入:555hello555

楼主忘记加stdio.h头文件  main函数也无需用int声明

补充内容 (2012-10-29 20:17):
因为程序中从未出现转义字符"\n" 所以打印输出时只会连续打印,不会换行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-10-29 20:27:35 | 显示全部楼层
谢谢你们的回答,不过请你们看清楚题目在回答好吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-10-29 20:28:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-29 20:39:57 | 显示全部楼层
前面一个,第一个f()是乱码,第二个f()是555吧;后面一个第一个还是乱码,第二个应该去的是hello前四个字节的%d输出吧,不知道对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-29 20:40:45 | 显示全部楼层
两种情况f()函数输出的都是一个无效的数,因为你没对i初始化。
你在第一个f()函数中对i赋值不会影响到第二个f()函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-29 20:53:54 | 显示全部楼层
楼主确定这代码能编译通过?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-29 21:00:14 | 显示全部楼层
int f()应该改成void f()才能编译通过的吧?,如果把代码改这样,我想VC++环境下DeBug版本的输出应该是被初始化为0XCCCCCCCC的值,至于Release版本的这就跟栈有关系了,这可以说是个随机值,当然如果楼主对栈足够了解的话也可以推算出输出的值。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-10-29 21:05:07 | 显示全部楼层
把你们的想法都说说   

我在VC6。0上编译 ,结果
前一个和后一个输出的I都是随机数,证明了退出f()函数后局部变量I被释放了,所以I输出的值都是随机数。


但是我在这个题目是一本书上面的,书上的结果很不可思议,不知道是为什么,书上面的结果是,前一个
的第一个输出随机数,第二个输出555。后一个的第一个I输出随机数,然后输出hello,第二个I输出0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-29 21:09:50 | 显示全部楼层
090704020006 发表于 2012-10-29 21:05
把你们的想法都说说   

我在VC6。0上编译 ,结果

这个需要考虑栈的问题,第一个的变量是被释放了,但是值还是在那个变量的地址,你第二次调那个函数的时候,那个i的地址就是你第一个函数的i的地址,所以是555,不过这个555本质上还是乱码;至于后面一个我也不懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-10-29 21:11:22 | 显示全部楼层
先看第一个:
  • # include <stdio.h>
  • int f()
    { int i; //这里定义变量i,操作系统会为变量i分配地址空间,但i变量内储存的是一个垃圾值,尚未初始化
      
    printf("%d", i);  //十进制格式输出垃圾值 i

    i=555;//先输出后定义不会输出 555
    }

  • int main()  //从主函数开始执行
    {
    f();//调用f函数,因为i 是在函数f中定义的,调用完毕后为变量i分配的空间会被操作系统释放
    f();//调用f函数,第二次调用 i内仍然是一个垃圾值
    }

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-10-29 21:17:25 | 显示全部楼层
thxxthxx 发表于 2012-10-29 21:09
这个需要考虑栈的问题,第一个的变量是被释放了,但是值还是在那个变量的地址,你第二次调那个函数的时候 ...

你这种想法,在书上面写是不对的, 1.jpg ,VC6.0 第一个的2个I都是输出随机数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-10-29 21:19:11 | 显示全部楼层
空间微粒 发表于 2012-10-29 21:11
先看第一个:
  • # include

  • 我在VC6。0上编译 ,结果
    前一个和后一个输出的I都是随机数,证明了退出f()函数后局部变量I被释放了,所以I输出的值都是随机数。


    但是我在这个题目是一本书上面的,书上的结果很不可思议,不知道是为什么,书上面的结果是,前一个
    的第一个输出随机数,第二个输出555。后一个的第一个I输出随机数,然后输出hello,第二个I输出0。
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    发表于 2012-10-29 21:20:30 | 显示全部楼层
    • #include<stdio.h>

    • int f()
      {
        int i;//  定义变量i ,操作系统会为变量i分配内存空间,但i内存放的是一个垃圾值
    •      printf("%d", i);//输出这个垃圾值
           i=555;//先输出后定义没有实际意义
      }

    • int main() //从主函数开始执行
      {
      f();//调用函数f,调用完毕后在函数f中的i的空间被操作系统回收
    • printf("hello");  //输出"hello"
      f();/*
      这次调用不会沿用上次定义的i的值,因为上次调用为i所分配的地址已经被回收,这次分配给i的地址空间是另外一个,及时还是原来那个地址,也可能被其他程序占用过,里面存放的仍然是一个垃圾值*/

    •     return 0;
      }
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    发表于 2012-10-29 21:22:50 | 显示全部楼层
    090704020006 发表于 2012-10-29 21:19
    我在VC6。0上编译 ,结果
    前一个和后一个输出的I都是随机数,证明了退出f()函数后局部变量I被释放了,所 ...

    两次操作系统给i分配的内存地址不一定是同一个地址,而且还有可能被其他程序占用,所以输出555的几率几乎等于买彩票
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
     楼主| 发表于 2012-10-29 21:24:15 | 显示全部楼层
    我其实想问的是,书上面为什么会写出这种答案?
    第一个:
    543453324
    555
    第二个:
    435335355
    hello
    0
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    发表于 2012-10-29 21:27:23 | 显示全部楼层
    090704020006 发表于 2012-10-29 21:19
    我在VC6。0上编译 ,结果
    前一个和后一个输出的I都是随机数,证明了退出f()函数后局部变量I被释放了,所 ...

    可能是编译系统的规则,如果编译系统在分配内存后不释放,就可能输出那样的值,你看看他用的是什么编译系统?是什么书上的题呢?看看是不是书上表述有问题?
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    发表于 2012-10-29 21:27:50 | 显示全部楼层
    090704020006 发表于 2012-10-29 21:17
    你这种想法,在书上面写是不对的,,VC6.0 第一个的2个I都是输出随机数

    我说的也只是特指情况,书上说的结论很有局限性,而且这个还涉及到寄存器的,不同情况不同对待,不过最后说一句,虽然书大部分是对的,但是不能尽信书,有时间可以看看汇编,看看寄存器是怎么走的
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
     楼主| 发表于 2012-10-29 21:32:58 | 显示全部楼层
    空间微粒 发表于 2012-10-29 21:22
    两次操作系统给i分配的内存地址不一定是同一个地址,而且还有可能被其他程序占用,所以输出555的几率几乎 ...

    忘了告诉你们我是在linux下才能得出书上的结果,还有我反复运行后 结果还是你所说中彩票几率的555,这是为什么?
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-8 20:47

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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