关于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()这一行。。

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

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

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

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

内存地址有负区间的。

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

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

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