C++:字符串数组越界问题!困惑中...等待大家的解答中...

Stefan段 2008-11-18 05:14:47
#include<iostream.h>
void main()
{
char a[5];
char b;
cin>>a;
cin>>b;
cout<<a<<endl<<b<<endl;
}

运行输入:
123
456789
输出:
123
4

#include<iostream.h>
void main()
{
char a[5];
char b[1];
cin>>a;
cin>>b;
cout<<a<<endl<<b<<endl;
}

运行输入:
123
456789
输出:
89
456789

谁能给个解释不?谢谢!学习中...
...全文
308 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
condor888 2008-11-19
  • 打赏
  • 举报
回复
偶新手,看了大家的解说还是不懂
hai040 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zmlovelx 的回复:]
第一个程序cin>>b;系统认为是读一个字符 所以读入一个字符后就完事了.

第二个程序 cin>>b;系统认为是读入一个字符串,会把你后面输出的45678全部读入,b[0]==4
而b[1]到b[5] 为"5678" 注意b[1]到b[5]其实是越界了,b[0]到b[3]占用一个32bits空间
b[4]-b[5]就是89修改了a[0]到a[1]的值. 此时a[0]==8;a[1]==9
所以输出
89
456789
[/Quote]
up,cout << (void*)a << '\n' << (void*)b << '\n';
taodm 2008-11-19
  • 打赏
  • 举报
回复
换一个编译器,你就可能得到不同的结果了。
所以,不要把太多的生命浪费在“错误究竟是怎样的内部细节过程”上。
Stefan段 2008-11-19
  • 打赏
  • 举报
回复
我知道这样不行,我无意中测试,不明白什么原因,所以问问!
帅得不敢出门 2008-11-18
  • 打赏
  • 举报
回复
第一个程序cin>>b;系统认为是读一个字符 所以读入一个字符后就完事了.

第二个程序 cin>>b;系统认为是读入一个字符串,会把你后面输出的45678全部读入,b[0]==4
而b[1]到b[5] 为"5678" 注意b[1]到b[5]其实是越界了,b[0]到b[3]占用一个32bits空间
b[4]-b[5]就是89修改了a[0]到a[1]的值. 此时a[0]==8;a[1]==9
所以输出
89
456789
P_ghost 2008-11-18
  • 打赏
  • 举报
回复
哪有人这样输入的哦,直接向数组输入,看来楼主还需要看看“圣经”
muyingchi 2008-11-18
  • 打赏
  • 举报
回复
第一个cin>>b,是按照char版的重载调用的>>,而第二个则被认为是一个字字符串,按照字符串版本的重载调用>>
而字符串版本要求0结尾的字符串,而当他一直找不到0时,就会出现这样的乱值,有可能内存地址后面有一个0为止,也可能找不到而报错。总之,这是故意搞乱内存,出现这种问题是正常的。
如果想得到正确而且不需要调整长度的字符串输入,建议使用std::string,作为输入对象。他会自动扩充来容纳输入。
就呆在云上 2008-11-18
  • 打赏
  • 举报
回复
第一个没有问题,很简单,一个char就只能读入一个char字符,而且是从缓冲区里面读取,那么自然也就只能读取一个字符了,就是4
后面的都留在了缓冲区域了



#include <iostream>
using namespace std;
void main()
{
char a[5];
char b[1];
cin>>a;
cin>>b;
cout <<a <<endl <<b <<endl;
}
//程序推出时报错

看看第二个,你这里是使用的一个数组,cin>>b,编译器肯定认为你的是输入一个字符串,因此你写入再多也不会有问题的,都能显示
但是问题就出现了,是什么呢?
就是系统释放b的内存的时候,会出现运行是段错误
为什么出现段错误呢?
是因为系统在栈里面分配了一个字节的b大小,然后随后就是一个cookie也就是一个标记,你这么往里面写越界就覆盖了后面的这个标记cookie,系统回收的时候找不到这个标记,运行是报错!
就这样。
lq651659889 2008-11-18
  • 打赏
  • 举报
回复
期待高手第二个也不知道为什么是这样?
elmnd 2008-11-18
  • 打赏
  • 举报
回复
用动态数组呗
sffofn 2008-11-18
  • 打赏
  • 举报
回复
换而言之,你用CString就没问题,因为c++会自带'\0'做结束的,所以在操作char字符串的时候需要注意这一点,分配内存也需要多分配一位用来容纳'\0'.........
sffofn 2008-11-18
  • 打赏
  • 举报
回复
楼主你把b[1]改成b[2]就OK了,因为char数组本身就需要已'\0'为结尾的,这样的话你b[1]本身就是空的,根本容纳不了数值进去,所以出现了那样的结果,你调试a 输入123333进去你就可以发现a只会输出1233 因为'\0'结尾就占了个1位.
cyj626 2008-11-18
  • 打赏
  • 举报
回复
没有出现楼主的问题,调试过
hhyttppd 2008-11-18
  • 打赏
  • 举报
回复
这跟cin对>>的重载有关
其中各个重载实现不同。建议你调试的时间跟进去。
1 应该很好解释

2 这个就存在内存越界的问题。
因为数据作为参数传递给函数的时候会作为指针,因而不会与 1 调用同一个函数。
这情况存在越界的可能。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧