这是在调试程序时发现的,gcc中使用scanf的一个小陷阱计算机二级考试

文章作者 100test 发表时间 2009:06:15 10:08:21
来源 100Test.Com百考试题网


  编辑特别推荐:

  全国计算机等级考试(等考)指定教材

  全国计算机等级考试学习视频

  全国计算机等级考试网上辅导招生

  全国计算机等级考试时间及科目预告

  百考试题教育全国计算机等级考试在线测试平台

  全国计算机等级考试资料下载

  全国计算机等级考试论坛

  计算机等级考试四级应用题解析汇总

  2009年下半年全国计算机二级考试报名时间从6月1日起已经开始报名。详情点击:2009年下半年全国计算机等级考试各地报名点汇总。2009年下半年全国计算机二级考试时间是2009年9月19日至23日。更多优质资料尽在百考试题论坛 百考试题在线题库

  这是在调试程序时发现的。如下一小段代码:
  #include <.stdio.h>.
  int main() {
  short n, m.
  scanf("%d", &.n).
  printf("n = %d\n", n).
  scanf("%d", &.m).
  printf("n = %d, m = %d\n", n, m).
  return 0.
  }
  在命令行下分别使用gcc和cl编译连接:
  D:\MyDocuments\My Projects\alltest_console>.gcc test.c -o test_gcc.exe
  D:\MyDocuments\My Projects\alltest_console>.cl test.c /Fetest_vc.exe
  D:\MyDocuments\My Projects\alltest_console>.test_gcc
  3
  n = 3
  4
  n = 0, m = 4
  D:\MyDocuments\My Projects\alltest_console>.test_vc
  3
  n = 3
  4
  n = 3, m = 4
  可以看到,在gcc中,输入m的值后,n的值居然变成了0!
  道理应该很明显:n和m的内存边在一起,它们都是short,两个变量总共占了四个字节,而scanf输入整数的时候,scanf是用了四个内存字节来接收数据。因此低16位给了m,高16位给n了。为了验证这个想法,再输入下面的数据进行测试:
  D:\MyDocuments\My Projects\alltest_console>.test_gcc
  3
  n = 3
  65536
  n = 1, m = 0
  果然如此。这么看来,有两种避免方法:要么把n和m都声明成int,要么使用能输入short的格式控制符。可以在windows的MSDN中查看scanf的输入格式,没有发现有特别为输入short而定义的格式控制符。
  看来,最好不要为了节省内存而使用诸如short和float这样的“不完整的类型”。

  2009年9月全国计算机等级考试时间及科目预告

  2009年NCRE考试有新变化

  2009年全国计算机等级考试-大纲

  全国计算机等级考试历年真题及答案

  2009年上半年全国计算机等级考试试题及答案



相关文章


令operator=返回一个referenceto*this计算机二级考试
这是在调试程序时发现的,gcc中使用scanf的一个小陷阱计算机二级考试
C 默默编写并调用哪些函数计算机二级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛