mizaru
2015-04-14 03:27
采纳率: 85.7%
浏览 2.0k
已采纳

关于scanf的输入输出问题

main()
{
int ir=0;
uur:
/*getch();*/
printf("333\n");
/*getch();*/
scanf("%d",&ir);
clear_kb();
printf("t=%d\n",ir);
printf("t=%d\n",&ir);
/*getch();*/
goto uur;
}
clear_kb(void)
{
char junk[4096];
/* gets(junk);*/

不知道你们run这段代码有没有问题。。
我运行的时候错误如下
1.输入和输出不一致。。
2.不论我输入的是什么。。打印出来的内存地址&ir不是-58,就是-60,但内存地址应该是个正整数才对吧?
3.如果我用 goto 返回 开头,那么系统会自动跳过 scanf()这一行。。

我不知道在你们的电脑上是否有同样的问题。。。??

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • 91program 2015-04-14 03:32
    已采纳

    scanf("%d",&ir);
    clear_kb();
    printf("t=%d\n",ir); // 此处是你通过 scanf("%d",&ir); 输入的值
    printf("t=%d\n",&ir); // 取地址,是输出 ir 的地址,而不是 ir 的值。地址是由编译器分配的,输出 地址最好是通过 %x 来输出。

    已采纳该答案
    打赏 评论
  • threenewbee 2015-04-14 03:30

    但内存地址应该是个正整数才对吧
    不一定。取决于你使用的是有符号整数还是无符号整数。
    对于4294967295这个数,它当然是正的,但是如果用int,那么它就是-1。

    打赏 评论
  • threenewbee 2015-04-14 03:32

    clear_kb(void)的代码在哪里。这个程序也不完整。

    打赏 评论
  • yanlijun_java 2015-04-14 03:39

    内存地址有负区间的。

    打赏 评论
  • Dean_Deng 2015-04-23 01:51

    你的程序clear_kb(void)代码不全,所以我去掉在VC6.0里测了下,地址都是一样的,
    我的理解是,程序在int ir = 0时编译器已经分配好了内存地址,然后就是依次执行里面
    goto类似循环一样,地址不会被重新分配应该一样,不知道是不是void_kb函数有影响。
    我的测试结果如下图:
    图片说明

    打赏 评论
  • Dean_Deng 2015-04-23 02:15

    还有一种可能就是你的程序中拿到的内存地址数值较大,普通整型范围的数无法表示,
    你把printf("t=%d\n",&ir);换成printf("t=%ld\n",&ir);用长整型试试。
    C语言不同数据类型的转换较大值转换数值范围较小类型,会溢出,会以补码形式转换数值,正数可能变负数。

    打赏 评论
  • Dean_Deng 2015-04-23 02:29

    计算机中内存地址大都以16进制表表示,范围较大,所以用%x指定16进制指定&ir比其他都要好些,所以我刚才%ld也不是很好。
    然后你再把这个16进制数转换成十进制,看它是不是已经超过了int范围,超过了,就说明直接%d变负数,是值太大的原因。
    另外goto在我这里测试不会跳过scanf输入。

    打赏 评论

相关推荐 更多相似问题