C++字符数组越界问题的一个案例分…
来源:互联网 发布:怎样查询淘宝店铺贷款 编辑:程序博客网 时间:2024/06/05 20:21
2013-05-1505:43
我的学生yang1067155909给我来信,说的是C++第11周项目3- CEmployee类继承自CPerson类中的一个细节:
贺老师:
学生,杨腾飞
我回答:
要给'\0'占个座。是用别人的地盘(越界的部分)保存了自己的信息了吧,不定哪次人家要用,运行结果就不一样了。这恰是最危险的问题。
他继续追问:
可是在定义字符数组时,比如a[4]时,可以输入5个字符,那么这个数组的'\0'的位置是不是也占用了别人的?
我为这个机灵的同学的问题感到激动,读程序,切忌只是读,要会提问题。能自己提出问题,就一定能学好。老师给出解答,接着再提出新问题,自己解答,或再问老师,这就是交流。为着学生提出了好问题,作为老师,我骄傲。我的回答是:
你提的问题不是一般的好,见我新发表的博文谈这个问题。
下面就是我对这个问题的解答。不妨针对问题设计一个程序试一试。程序是:
[cpp]
#include
using
int
{
}
亲爱的读者,读这篇文章时,请不要只“读”,打开你熟悉的编程环境,边读边运行。你会发现什么?
输入abcd然后回车,输出是abcd。cout<<a是将字符数组当字符串输出的,显然abcd已经占满了自己的地盘a[0]到a[3],能够“如愿”输出,实际上已经侵占了不该占的内存a[4]单元。当然,恰好a[4]处给脸,就是'\0'。如果”烫烫烫烫烫烫“不必意外。
再运行,输入abcde。我运行的结果是,在VC++6.0中,输出abcde,并弹出了我们熟悉的内存越界错误提示。在codeBlocks下,输出abcde,什么也没提示。请读者想想,这是一个多么凶险的Bug。
下面再给出一个程序:
[cpp]
#include
using
int
{
}
运行的任务交给读者了,观察输入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的顺序换了一下:
[cpp]
#include
using
int
{
}
运行结果会是怎样?读者你自己说吧。不要忘了,用调试工具这个法宝解除你的疑惑。
0 0
- C++字符数组越界问题的一个案例分…
- C++字符数组越界问题的一个案例分析
- 关于C语言,字符数组中越界的两个问题
- 一个数组越界问题 数组越界
- 字符数组越界问题探究
- C/C++ bug_1:字符数组越界
- 一个很隐蔽的数组下标越界问题
- 关于Java数组越界的一个诡异问题【leetcode204】
- 关于数组的越界问题
- 隐蔽的数组越界问题
- 数组越界的另一问题
- 一个越界的的问题
- [C语言]给一个二维字符数组赋值的问题
- 字符数组的一个问题
- C语言数组越界问题实例
- C/C++中键盘输入数组越界问题
- 【问题汇总】列表数组越界的问题
- 【C/C++】数组越界
- 设置整型变量a的bit3
- 使用dynamic_cast转换的一个例子
- AndrowListView实现(自定义游戏列表)防止屏幕闪烁,设置分割线android中不推荐的方法,要考虑向下兼容,用了推荐的新方法,可能不兼容旧版本系统的手机
- 给出一个单链表,不知道节点N的值…
- 【转载】关于main函数的(int_argc,…
- C++字符数组越界问题的一个案例分…
- junit学习笔记2
- Android高效加载大图、多图解决方案,有效避免程序OOM
- Go语言并发与并行学习笔记(一)
- 【转载】头文件string与string.h的…
- HDU 4734 F(x)
- ADO+Visual C++数据库连接和操作
- 归并算法实现
- 一、冒泡(Bubble)排序