
昵称:上善若水
等级:用户
文章:7151
积分:892
星座: 金牛座 |
发信人: lanphon (从此低调), 信区: CPP 标 题: 这是为什么呢?DEV-C++4.9.9.2的诡异输入问题 发信站: 北邮人论坛 (Sat Jul 4 10:03:17 2009), 站内 做一个小程序的时候发现的。代码如下,使用的编译器为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"); } -- 男:我好喜欢你。 女:我也好喜欢我。 ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 59.64.153.*] |
|

昵称:pm
等级:用户
文章:24
积分:128
星座: 魔羯座 |
发信人: tjpm (pm), 信区: CPP 标 题: Re: 这是为什么呢?DEV-C++4.9.9.2的诡异输入问题 发信站: 北邮人论坛 (Sat Jul 4 16:31:42 2009), 站内 gcc的问题。DEV-C++是基于GCC的吧。。 intel的C编译器是没问题的。 【 在 lanphon (从此低调) 的大作中提到: 】 : 做一个小程序的时候发现的。代码如下,使用的编译器为DEV-C++ 4.9.9.2。 : 如果先要求输入a,再要求输入b,那么a的值无论输入多少(少于255)输出都会是0; : 反过来,如果先要求输入b,再要求输入a,那么就会正常。 : ................... -- ※ 来源:·北邮人论坛 forum.byr.edu.cn·[FROM: 202.120.183.*] |
|

昵称:上善若水
等级:用户
文章:7151
积分:892
星座: 金牛座 |
发信人: lanphon (从此低调), 信区: CPP 标 题: Re: 这是为什么呢?DEV-C++4.9.9.2的诡异输入问题 发信站: 北邮人论坛 (Sat Jul 4 17:18:02 2009), 站内 难道和定义的时候的顺序有关? -- 男:我好喜欢你。 女:我也好喜欢我。 ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 59.64.153.*] |
|

昵称:Jackal The Dire
等级:版主
文章:2096
积分:579
星座: 水瓶座 |
发信人: jokerlee (Jackal The Dire), 信区: CPP 标 题: Re: 这是为什么呢?DEV-C++4.9.9.2的诡异输入问题 发信站: 北邮人论坛 (Sun Jul 5 12:36:06 2009), 站内 gcc 4.4验证确实有此问题, 换成int就没问题, 挺奇怪的 -- To do is to be. ----Kant To be is to do. ----Nietzsche JackalDire的个人Blog开张了~~ --- http://jackaldire.com ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 59.64.254.*] |
|

昵称:Jackal The Dire
等级:版主
文章:2096
积分:579
星座: 水瓶座 |
发信人: jokerlee (Jackal The Dire), 信区: CPP 标 题: Re: 这是为什么呢?DEV-C++4.9.9.2的诡异输入问题 发信站: 北邮人论坛 (Sun Jul 5 12:48:58 2009), 站内 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覆盖,覆盖掉的应该是栈头部的参数区。 -- To do is to be. ----Kant To be is to do. ----Nietzsche JackalDire的个人Blog开张了~~ --- http://jackaldire.com ※ 修改:·jokerlee 于 Jul 5 20:14:26 修改本文·[FROM: 59.64.254.*] ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 59.64.254.*] |
|

昵称:上善若水
等级:用户
文章:7151
积分:892
星座: 金牛座 |
发信人: lanphon (从此低调), 信区: CPP 标 题: Re: 这是为什么呢?DEV-C++4.9.9.2的诡异输入问题 发信站: 北邮人论坛 (Sun Jul 5 19:43:44 2009), 站内 受教了 -- 男:我好喜欢你。 女:我也好喜欢我。 ※ 来源:·北邮人论坛 http://forum.byr.edu.cn·[FROM: 59.64.153.*] |
|