C++-给新建的字符指针赋很多个值时,输出结果不正常?
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
给没有分配地址的指针进行强制索引和复制时,就会有可能覆盖到正在被使用的地址,
如果是无意识的去覆盖控制运算相关的数据,你就惨了
当然,C/C++ 被设计成可以这么做的目的是为了让程序猿可以无障碍的控制内存。
如果不晓得内存位置的某一段是什么,那就不要做这种傻事儿。
malloc 一下,或者直接用定长的数组是比较明智的,不过越界了同样不会有 java 那样的提示
简化问题的话,还是用 string 靠谱些
祝好,
斑驳敬上
虽然程序能够运行,但是存在很大的问题。
首先你的本意是想动态分配一个数组用来保存用户的输入,但你的程序却写成了
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;
}
new
配对的delete?
我觉得你的代码有两个问题:
1. 你new的时候,没有指定申请的空间大小,这样导致不确定起始地址后面到底有多长的连续空间可以供你使用;
2. 是不是少了和new搭套的delete?。。
刚看了ajaxhe的代码,应该已经完全满足了你的需求。如果你确实需要动态数组的应用。请参考
http://blog.csdn.net/lxmky/article/details/7973712
如果不需要,那就全当是学习一下吧。