C++-给新建的字符指针赋很多个值时,输出结果不正常?

发布于 2016-11-09 19:05:32 字数 725 浏览 1285 评论 3

#include <iostream>
using namespace std;
void main()
{
char *c1=new char;
c1[0]='0'; //填充0号位置的字符
cout<<"请输入主串:";
int i=0;
char temp;
for(;(temp=getchar())!='n';) //请输入几十个试试
c1[++i]=temp;
char *c2=new char;
c2[0]='0'; //填充0号位置的字符
cout<<"请输入模式串:";
int j=0;
for(;(temp=getchar())!='n';) //请输入几十个试试
c2[++j]=temp;
for(int a=1;a<=i;a++){
cout<<c1[a];
}
for(int b=1;b<=j;b++){
cout<<c2;
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清晨说ぺ晚安 2017-09-30 02:08:17

给没有分配地址的指针进行强制索引和复制时,就会有可能覆盖到正在被使用的地址,
如果是无意识的去覆盖控制运算相关的数据,你就惨了

当然,C/C++ 被设计成可以这么做的目的是为了让程序猿可以无障碍的控制内存。
如果不晓得内存位置的某一段是什么,那就不要做这种傻事儿。

malloc 一下,或者直接用定长的数组是比较明智的,不过越界了同样不会有 java 那样的提示
简化问题的话,还是用 string 靠谱些

祝好,
斑驳敬上

瑾兮 2017-08-25 20:07:59

虽然程序能够运行,但是存在很大的问题。

首先你的本意是想动态分配一个数组用来保存用户的输入,但你的程序却写成了

char *c1=new char;

这里仅仅是分配一个char内存单元,如果你输入一串字母"just a test",确实这个字符串确实会放在c1后的11内存单元中,但无法保证这段内存空间是属于c1的。

仅接着,程序里面有执行了下面的语句:

 char *c2=new char;

如果c2得到的地址正好位于[c1, c1+11]这个内存区间中,执行

 c2[++j]=temp;

就会覆盖了原来的值。

做了下简单修改,仅供参考。

 #include <iostream>
using namespace std;

void main()
{
const int MAXLENGTH = 100;
char *c1=new char[MAXLENGTH];
c1[0]='0'; //填充0号位置的字符
cout << "请输入主串:" << endl;
int i=0;
char temp;
for(;(temp=getchar())!='n';) //请输入几十个试试
c1[++i]=temp;
char *c2=new char[MAXLENGTH];
c2[0]='0'; //填充0号位置的字符
cout << "请输入模式串:" << endl;
int j=0;
for(;(temp=getchar())!='n';) //请输入几十个试试
c2[++j]=temp;
for(int a=1;a<=i;a++){
cout<<c1[a];
}
cout << endl;
for(int b=1;b<=j;b++){
cout<<c2[b];
}
cout << endl;

delete[] c1;
delete[] c2;
}

想挽留 2017-03-12 10:13:17

new
配对的delete?
我觉得你的代码有两个问题:
1. 你new的时候,没有指定申请的空间大小,这样导致不确定起始地址后面到底有多长的连续空间可以供你使用;
2. 是不是少了和new搭套的delete?。。

刚看了ajaxhe的代码,应该已经完全满足了你的需求。如果你确实需要动态数组的应用。请参考
http://blog.csdn.net/lxmky/article/details/7973712
如果不需要,那就全当是学习一下吧。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文