这是在调试程序时发现的,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年上半年全国计算机等级考试试题及答案