一个字符数组可以存放多少个字符的问题

liweiwu032 2009-02-21 12:27:14
测试程序主要部分如下:
#define N 1
char s[N],*p;
p=s;
cin>>p;
cout<<"p="<<p;
定义了一个可以存放一个字符的数组,输入一个字符时,程序可以正常输出和结束,分别输入2,3,4个字符都可以正常输出和结束,但当输入5个或者更多的字符时,可以正常输出但程序退出的时候会异常
试问怎么解释呢?
N=2,3,4时还是这样,但N=5时程序退出时又不会异常
问下达人怎么解释、、、、、、
...全文
1173 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gu302 2009-02-23
  • 打赏
  • 举报
回复
1楼正解 建议楼住 好好看看C++中 数组与指针的资料 很多人在这方面都不行
蜥蜴枪王 2009-02-21
  • 打赏
  • 举报
回复
1L 正解
danxuezx 2009-02-21
  • 打赏
  • 举报
回复
没弄明白你的操作过程
sagegz 2009-02-21
  • 打赏
  • 举报
回复
p是个指针,你输入的是指针的地址.
char s[N]里面最多只能存放一个字符,多输的会被截断.

#include <iostream>
using namespace std;

#define N 1
int main(){
char s[N],*p;
p=s;
cin>>*p;
cout <<"*p=" <<*p;
return 0;
}
fibbery 2009-02-21
  • 打赏
  • 举报
回复
你的字符串已经破坏了调用堆栈,开始的几字节还没有大的问题,可能是返回值等等的位置,再长的字符串将破坏程序的返回地址,导致程序在退出时非法。
mosaic 2009-02-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 arong1234 的回复:]
你这种说法是错误的, cin才不知道你只有一个字符的空间,他不会只保存一个字符,而是你输入多少就保存多少。但是从第二个字符开始“保存”就内存越界了,当越界导致其他代码访问越界,或者越界到只读存储段时,才会有异常
引用 4 楼 waizqfor 的回复:
引用楼主 liweiwu032 的帖子:
你创建的是一个char *字符指针 只能存储一个字符啊 这样做没什么不对啊
你输入多的时候 当然只有保存了你第一输入的字符了
[/Quote]

顶,看了前面几个贴,有误导的嫌疑,呵呵。
liweiwu032 2009-02-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 arong1234 的回复:]
你这种说法是错误的, cin才不知道你只有一个字符的空间,他不会只保存一个字符,而是你输入多少就保存多少。但是从第二个字符开始“保存”就内存越界了,当越界导致其他代码访问越界,或者越界到只读存储段时,才会有异常
引用 4 楼 waizqfor 的回复:
引用楼主 liweiwu032 的帖子:
你创建的是一个char *字符指针 只能存储一个字符啊 这样做没什么不对啊
你输入多的时候 当然只有保存了你第一输入的字符了

[/Quote]这位大哥说中了我的疑问,之前我就是不清楚只有一个字符的空间,但却可以保存多个字符。你说的只读读存储段,是不是四个字节的呢?要不然我输入5个字符的时候程序退出就会发生异常?
arong1234 2009-02-21
  • 打赏
  • 举报
回复
正解?解的是什么?1楼只是弄出一个能正确运行的代码而已,而问题还在那儿。就好像你问路到xx怎么走,你说飞机是在天上飞的,答案完全对,却毫无关系
[Quote=引用 3 楼 youyulangzi 的回复:]
1L 正解
[/Quote]
liweiwu032 2009-02-21
  • 打赏
  • 举报
回复
多谢各位,经各位讲解,有点头绪了,看来字符串这方面的知识得下点功夫才能够真正的掌握啊、、、、
arong1234 2009-02-21
  • 打赏
  • 举报
回复
你这种说法是错误的, cin才不知道你只有一个字符的空间,他不会只保存一个字符,而是你输入多少就保存多少。但是从第二个字符开始“保存”就内存越界了,当越界导致其他代码访问越界,或者越界到只读存储段时,才会有异常
[Quote=引用 4 楼 waizqfor 的回复:]
引用楼主 liweiwu032 的帖子:
你创建的是一个char *字符指针 只能存储一个字符啊 这样做没什么不对啊
你输入多的时候 当然只有保存了你第一输入的字符了
[/Quote]
arong1234 2009-02-21
  • 打赏
  • 举报
回复
你的数组只有一个字符的空间,实际用cin>>s无论你输入多少个字符都是非法的,因为即使你只输入1个字符,他也需要占用2个字节

你判断问题的方式有问题,有问题但是问题不一定会暴露出来。你用是否暴露问题来判断是否有问题,这种方法本身就是错误的。而实际工作中,能暴露出来的问题总会有办法去解决的,而不暴露出来的问题才是最具危害的。假定你运行一个软件,其实第一天就错了,但是由于没暴露出来,可能两年后你才发现你损失了很多钱(这在银行业、国防领域之类的可能尤为突出)

异常不是判断问题的唯一标准,很多情况都是没有异常的,所以在“我越界了,为什么没异常?难道越界可以吗?”这种想法本身就是非常非常错误的。
waizqfor 2009-02-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 liweiwu032 的帖子:]
测试程序主要部分如下:
#define N 1
char s[N],*p;
p=s;
cin>>p;
cout < <"p=" < <p;
定义了一个可以存放一个字符的数组,输入一个字符时,程序可以正常输出和结束,分别输入2,3,4个字符都可以正常输出和结束,但当输入5个或者更多的字符时,可以正常输出但程序退出的时候会异常
试问怎么解释呢?
N=2,3,4时还是这样,但N=5时程序退出时又不会异常
问下达人怎么解释、、、、、、
[/Quote]
你创建的是一个char *字符指针 只能存储一个字符啊 这样做没什么不对啊
你输入多的时候 当然只有保存了你第一输入的字符了

64,281

社区成员

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

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