时间紧张,先记一笔,后续优化与完善。

我的学生yang1067155909给我来信,说的是C++第11周项目3 - CEmployee类继承自CPerson类中的一个细节:

贺教师:

教师,m_szDepartment=new char[strlen(department)+1];为何须要+1呢?在测试里去掉+1后和这个效果一样啊,不太明确……求指教……
学生,杨起飞

我回答:

要给'\0'占个座。是用别人的土地(越界的部份)保存了自己的信息了吧,不定哪次人家要用,运行结果就不一样了。这恰是最危险的问题。

他继续追问:

可是在定义字符数组时,比如a[4]时,可以输入5个字符,那么这个数组的'\0'的位置是不是也占用了别人的?

我为这个机警的同学的问题感到激昂,读程序,切忌只是读,要会提问题。能自己提出问题,就一定能学好。教师给出解答,接着再提出新问题,自己解答,或再问教师,这就是交流。为着学生提出了好问题,作为教师,我骄傲。我的回答是:

你提的问题不是一般的好,见我新发表的博文谈这个问题。

下面就是我对这个问题的解答。不妨针对问题设计一个程序试一试。程序是:

#include <iostream>
using namespace std;
int main()
{ char a[4];cin>>a;cout<<a<<endl;return 0;
}

亲爱的读者,读这篇文章时,请不要只“读”,打开你熟习的编程环境,边读边运行。你会发现什么?

输入abcd然后回车,输出是abcd。cout<<a是将字符数组当字符串输出的,明显abcd已经占满了自己的土地a[0]到a[3],可以“如愿”输出,实际上已经侵犯了不应占的内存a[4]单元。当然,恰好a[4]处给脸,就是'\0'。如果”烫烫烫烫烫烫“不必意外。

每日一道理
一个安静的夜晚,我独自一人,有些空虚,有些凄凉。坐在星空下,抬头仰望美丽天空,感觉真实却由虚幻,闪闪烁烁,似乎看来还有些跳动。美的一切总在瞬间,如同“海市蜃楼”般,也只是刹那间的一闪而过,当天空变得明亮,而这星星也早已一同退去……

再运行,输入abcde。我运行的结果是,在VC++6.0中,输出abcde,并弹出了我们熟习的内存越界错误提示。在codeBlocks下,输出abcde,什么也没提示。

请读者想一想,这是一个多么凶恶的Bug。

下面再给出一个程序:

#include <iostream>
using namespace std;
int main()
{ char a[4],b[4];cin>>a;cin>>b;cout<<a<<endl;cout<<b<<endl;return 0;
}

运行的任务交给读者了,视察输入3个字符、4个字符、5个字符的情形,也可以在多个平台上试试,针对结果想一想为什么。用单步执行的手腕跟踪一下内存中的数据存储,是个强烈建议的方法。

下面是为a和b数组输入3个字符后(分别是abc和hij),利用单步执行看到的结果:

下面是为a和b数组输入5个字符后(分别是abcef和hijkl),利用单步执行看到的结果:

从中看出,VC++6.0中,先定义的a数组的地址大于后定义的数组b的地址,原来为a中输入了abcde,侵犯了别人的土地,随后为b输入hijkl,侵犯的就是a的土地,b[4]即a[0]为l,b[5]即a[1],存储的是'\0'!

下图是在codeBlocks下,用同样的输入调试截出的结果,结果一样:

接下来,再给一个程序,其实就是将输入a和b的顺序换了一下:

#include <iostream>
using namespace std;
int main()
{ char a[4],b[4];cin>>b;cin>>a;cout<<a<<endl;cout<<b<<endl;return 0;
}

运行结果会是怎样?读者你自己说吧。不要忘了,用调试工具这个法宝消除你的困惑。

文章结束给大家分享下程序员的一些笑话语录: 人脑与电脑的相同点和不同点,人脑会记忆数字,电脑也会记忆数字;人脑会记忆程序,电脑也会记忆程序,但是人脑具有感知能力,这种能力电脑无法模仿,人的记忆会影响到人做任何事情,但是电脑只有程序软件。比尔还表示,人脑与电脑之间最重要的一个差别就是潜意识。对于人脑存储记忆的特别之处,比尔表示,人脑并不大,但是人脑重要的功能是联络,人脑会把同样的记忆存储在不同的地方,因此记忆读取的速度就不相同,而这种速度取决于使用的频率和知识的重要性。人脑的记忆存储能力会随着年龄增长而退化,同时记忆的质量也会随着年龄退化。经典语录网

转载于:https://www.cnblogs.com/jiangu66/archive/2013/05/15/3080594.html

输入问题C++字符数组越界问题的一个案例分析相关推荐

  1. linux 串口 字符 间隔,嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)...

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include #incl ...

  2. 嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include<st ...

  3. 输入多组字符数组c语言,c语言怎样能连续输入多个一维数组

    您好 把具有相同数据类型的若干变量按有序的形式组织起来, 以便于程序处理,这些数据元素的集合就是数组,按照数组 元素的类型不同,可分为:数值数组.字符数组.指针数组 结构数组等各种类别. 数组说明的一 ...

  4. C语言字符数组越界问题

    C语言字符数组踩坑 如果运行下面的代码会发生输出什么? #include<stdio.h> #include<string.h>/*** 输出结果* a1:wohello* a ...

  5. 【PAT甲级 一个字符数组是否被另一个包含】1092 To Buy or Not to Buy (20 分) C++

    题目 给两个字符串,一个是卖的,一个是想买的. 你需要统计一下,看是不是卖的包含想买的. 如果包含,则YES,并输出多余的个数. 如果不包含,则No,并输出缺少的个数. 思路 维护两个数组,分别是已经 ...

  6. C语言二维字符数组的输入

    标题 C语言字符数组的输入输出 定义一个字符二维数组,输入行数n,与列数m #include <stdio.h> #include <math.h> int main() {i ...

  7. C/C++字符数组的输入输出方式详解

    字符是C/C++读入数据最主要的类型.本篇将介绍单个字符数组/多个字符串及二维数组的输入输出方式与相关函数. 目录 单个字符串处理 ​编辑 输入 逐个元素输入 整体串形式输入 输出 逐个输出 整体串形 ...

  8. strcmp可以比较数组么_6.3 C语言字符数组

    01字符数组的定义 1.用来存放字符数据的数组是字符数组.字符数组中的一个元素存放一个字符. 2.定义字符数组的方法和定义数值型数组的方法类似. 例子: char c[10]; 02 字符数组的初始化 ...

  9. c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...

    字符数组的存放方式 由于字符数组是由若干个char类型的元素组成的,因此字符数组的每一位都是一个char字符,除此之外,在一维字符数组或者二维字符数组的第二维的末尾都有一个空字符\0表示存放的字符串的 ...

最新文章

  1. Ubuntu 14.04上安装WineTMQQ2013麒麟版
  2. c语言调用oracle函数返回值吗,C语言通过值和引用函数
  3. arcgis 坐标系 2000坐标系_干货 | 关于投影和坐标系那些事,你是否都已还给了老师?...
  4. 读书笔记_Effective_C++_条款十九:设计class犹如设计type
  5. linux的基础知识——TCP通信状态
  6. Hbase二级索引入门
  7. 最新QQ搭建代挂系统2.0全新打包内带i优支付在线充值系统
  8. 用计算器算以2为底的对数
  9. 双网卡 跃点_关于windows 双网卡和跃点数研究
  10. 项目成本管理名词解析
  11. Python continue的用法
  12. Could not GET 'http://jcenter.bintray.com/com/github/dcendents/android-maven-gradle-plugin/2.1/andro
  13. Unsupported major.minor version 51.0 (unable to load class ……)解决办法
  14. 读书笔记-独立女性有的良性焦虑
  15. 网站被黑客攻击了该怎么处理 多年的网站安全维护经验分享
  16. 工程勘察设计收费标准2002_刚刚!我院史海欧总工程师获评全国工程勘察设计大师...
  17. php面试 思维,去面试,为什么被说「缺少结构化思维」?
  18. Spring源码学习第七天==>解析配置注解类与BPP
  19. 面试扇贝网前端实习生经历!
  20. 计算机编程方面有趣得小故事_有趣的计算机编程报价

热门文章

  1. 原生js和jquery常用的DOM操作
  2. 基于IP子网将加域的电脑移动到不同的OU
  3. Spring MVC url提交参数和获取参数
  4. css3特效-传送带示例
  5. 系统维护好帮手—Starter
  6. 无锡给的sql excel转换
  7. mdk系列 Adsl 成功上网指南(非USB ADSL)
  8. python创建自定义函数is_number()来判断一个字符是否是数字
  9. 集合的常用方法(增加、删除、并集、交集、差集、对等差分、超集和子集)
  10. Linux下的防火墙管理(包含图形和命令、伪装和转发)