北邮人论坛学术科技C/C++程序设计语言 → 这是为什么呢?DEV-C++4.9.9.2的诡异输入问题

     
本主题贴数6   分页: 1

 * 文章主题: 这是为什么呢?DEV-C++4.9.9.2的诡异输入问题  
  lanphon
  
  昵称:上善若水
  等级:用户
  文章: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.*]
  tjpm
  
  昵称:pm
  等级:用户
  文章:24
  积分:128
  星座:魔羯座 魔羯座
          1
发信人: 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.*]
  lanphon
  
  昵称:上善若水
  等级:用户
  文章:7151
  积分:892
  星座:金牛座 金牛座
          2
发信人: 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.*]
  jokerlee
  
  昵称:Jackal The Dire
  等级:版主
  文章:2096
  积分:579
  星座:水瓶座 水瓶座
          3
发信人: 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.*]
  jokerlee
  
  昵称:Jackal The Dire
  等级:版主
  文章:2096
  积分:579
  星座:水瓶座 水瓶座
          4
发信人: 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.*]
  lanphon
  
  昵称:上善若水
  等级:用户
  文章:7151
  积分:892
  星座:金牛座 金牛座
          5
发信人: 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.*]
本主题贴数6   分页: 1

  快速发表新帖子
主题标题   *不得超过 25 个汉字或50个英文字符
内容
选项   [查看签名档]
   

  
Powered by wForum Version 0.9
阿卡信息技术(北京)有限公司 & KBS 开发组 版权所有 2005-2006
wForum @zixia.net , 页面执行时间:15.591毫秒