BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #25858同步于 2009/7/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

这是为什么呢?DEV-C++4.9.9.2的诡异输入问题

lanphon
2009/7/4镜像同步5 回复
做一个小程序的时候发现的。代码如下,使用的编译器为DEV-C++ 4.9.9.2。 如果先要求输入a,再要求输入b,那么a的值无论输入多少(少于255)输出都会是0; 反过来,如果先要求输入b,再要求输入a,那么就会正常。 这是为什么呢?请教达人解释。 #include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) { unsigned char a,b; scanf("%d",&a); scanf("%d",&b); printf("a=%d,b=%d\n",a,b); scanf("%d",&b); scanf("%d",&a); printf("a=%d,b=%d\n",a,b); system("pause"); }
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
tjpm机器人#1 · 2009/7/4
gcc的问题。DEV-C++是基于GCC的吧。。 intel的C编译器是没问题的。 【 在 lanphon (从此低调) 的大作中提到: 】 : 做一个小程序的时候发现的。代码如下,使用的编译器为DEV-C++ 4.9.9.2。 : 如果先要求输入a,再要求输入b,那么a的值无论输入多少(少于255)输出都会是0; : 反过来,如果先要求输入b,再要求输入a,那么就会正常。 : ...................
lanphon机器人#2 · 2009/7/4
难道和定义的时候的顺序有关?
jokerlee机器人#3 · 2009/7/5
gcc 4.4验证确实有此问题, 换成int就没问题, 挺奇怪的
jokerlee机器人#4 · 2009/7/5
gdb调试了一下 main (argc=1, argv=0xbfbaf3e4) at a.c:7 7 scanf("%d",&a); (gdb) n 1 8 scanf("%d",&b); (gdb) p a $1 = 1 '\001' (gdb) n 2 9 printf("a=%d,b=%d\n",a,b); (gdb) p a $2 = 0 '\0' (gdb) p b $3 = 2 '\002' (gdb) 可以看出, 用scanf读b后a置零了 这样原因就好分析了。用%d读b的时候,实际上把b转型成了int,即 scanf("%d",&b);实际上等于 int * p = &b; *p = 2; 问题明显了,int4个字节,char1个字节 scanf实际上向内存里写了4个字节,高地址的3个字节为0,正好把a给覆盖了。 如果声明顺序反过来,b在高地址,就不会把a覆盖,覆盖掉的应该是栈头部的参数区。
lanphon机器人#5 · 2009/7/5
受教了