关于变量的类型与变量初始化的一点思考

这几天一直再看《C primer plus》,然后写一些书上习题的小程序。在调试的过程中遇到一些问题。

 

详见图片。

 

大家注意,在调试过程中,遇到了一个警告提示。

Run-time Check Failure #2 - Stack around the variable 'ch_ascll' was corrupted

根据我超烂的英语知识+金山词霸的单词翻译和我的主观臆测,得到的结论是这段话的意思是说:在运行时检查变量数据在堆栈存储的范围发生异常。

我们现来看看代码:

 

// 3.11-2解答.cpp : 定义控制台应用程序的入口点。
//题目:要求输入一个ASCII码值,输出相应的字符 buy Bugsong
//作者blog:blog.csdn.net/bugsonglinux

#include "stdafx.h"
#include "stdio.h"

int _tmain(int argc, _TCHAR* argv[])
{
       char ch_ascii;
       ch_ascll = 0;
       printf("请输入一个ASCLL数值:/n");
       scanf("%u",&ch_ascll);
       printf("对应的字符是:%c",ch_ascll);
       return 0;
 
}

在这段小代码中定义的变量为char,但是在输入函数scanf中输入的数据类型说明符为%u(无符号十进制数)。

我想出现问题是在输入的是十进制数,但是变量的类型为char字符型,在内存空间的分配上出现了问题。还有就是ch_ascll变量在没有赋值进行初始化的时候还有一个警告,这个我忘记截图了。因为在程序的运行过程中变量会被随意赋值。

再来看张截图:

这个也是变量的类型问题,但是我不理解的是年龄是一个很小跨度的单位,小于200,对吧?这样用short int是很好的,但是用这个数据类型就是不行,可能是机器字长的问题吧,编译环境和硬件环境让short int和int都是32位的数据。所以会有相应的警告吧。

 

修改后的代码:

 

// 3.11-2解答.cpp : 定义控制台应用程序的入口点。
//题目:要求输入一个ASCII码值,输出相应的字符 buy Bugsong
//作者blog:blog.csdn.net/bugsonglinux

#include "stdafx.h"
#include "stdio.h"

int _tmain(int argc, _TCHAR* argv[])
{
         int ch_ascii;
         ch_ascll = 0;
         printf("请输入一个ASCII数值:/n");
         scanf("%u",&ch_ascii);
         printf("对应的字符是:%c",ch_ascii);
         return 0;
 
}


// 3.11-5解答.cpp : 定义控制台应用程序的入口点。
//题目:一年约有3.156*10^7s,输入年龄。换算成秒数
//作者blog:blog.csdn.net/bugsonglinux
//输入为short int 整形 输出为double浮点型数据

#include "stdafx.h"
#include "stdio.h"
#define TIME 31560000 //常量定义

int _tmain(int argc, _TCHAR* argv[])
{
        int i_age;
        double d_agetime;
        i_age = d_agetime = 0;  //初始化变量
        printf("请输入您的年龄:");
        scanf("%u",&i_age);
        d_agetime = i_age * TIME;
        printf("您的年龄转换为秒为:%f",d_agetime);
        return 0;
}

以上就是我的一点思考,有不对的地方欢迎大家拍砖!!两段代码在win7+vs2008以及winxp sp3+vs2008中编译通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值