返回信息流做一个小程序的时候发现的。代码如下,使用的编译器为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");
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #25858同步于 2009/7/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
这是为什么呢?DEV-C++4.9.9.2的诡异输入问题
lanphon
2009/7/4镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
gcc的问题。DEV-C++是基于GCC的吧。。
intel的C编译器是没问题的。
【 在 lanphon (从此低调) 的大作中提到: 】
: 做一个小程序的时候发现的。代码如下,使用的编译器为DEV-C++ 4.9.9.2。
: 如果先要求输入a,再要求输入b,那么a的值无论输入多少(少于255)输出都会是0;
: 反过来,如果先要求输入b,再要求输入a,那么就会正常。
: ...................
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覆盖,覆盖掉的应该是栈头部的参数区。