一个简单的C++改错,不知道错在哪啊?

Crack 2011-12-03 01:21:48
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char *str=new char[20];
str="wudemiao";
cout<<strlen(str)<<endl;
cout<<str<<endl;
int N=strlen(str);
int M=4;
char ch;
while(M--){
ch=str[N-1];
for(int i=N-1;i>0;i--)
{
str[i-1]=str[i-2];
}
str[0]=ch;

}
cout<<str<<endl;

}
用的编译器是vs2010总是执行一半就出错,不懂啊!!!
...全文
209 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumuzi 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yulinlang 的回复:]
char *str=new char[20];
str="wudemiao";

先定义了一个char *,指向new分配的char[20],
然后str又指向字符串常量"wudemiao",原来的char[20]地址丢失,内存泄漏。
但这还是其次,关键是大部分编译器实现里字符串常量处于只读区,不能修改其内容,
下面的str[0]一类的统统会出错。

所以如楼上,请使用strcpy……
[/Quote]
楼上正解!
s_april_s 2011-12-03
  • 打赏
  • 举报
回复
感觉到了c的魅力,各位大神都好强,要好好学,和楼主共勉!!
牛逼代码 2011-12-03
  • 打赏
  • 举报
回复
哈哈,刚刚纯属扯蛋………呵呵,见谅
牛逼代码 2011-12-03
  • 打赏
  • 举报
回复
楼上说的文章我看了,写的真好,对了,刚才就是内存泄漏问题,仔细揣摩一下就会明白,此处内存泄漏就象娶了媳妇放在家里不用,出门在外找二奶,资源浪费,还危险
群狼 2011-12-03
  • 打赏
  • 举报
回复
C语言是可以的,这是C和C++处理的不同 楼主想知道为什么的话,一言两语是说不清的,建议去看看论坛某位大牛写的 数组与指针 的文章——
http://blog.csdn.net/supermegaboy/article/details/4855036
你所说的问题在第五章有解释——http://blog.csdn.net/supermegaboy/article/details/4854987
[Quote=引用 7 楼 wudemiao1246403394 的回复:]
引用 3 楼 yulinlang 的回复:

char *str=new char[20];
str="wudemiao";

先定义了一个char *,指向new分配的char[20],
然后str又指向字符串常量"wudemiao",原来的char[20]地址丢失,内存泄漏。
但这还是其次,关键是大部分编译器实现里字符串常量处于只读区,不能修改其内容,
下面的str[0]一类的……
[/Quote]
skyygl 2011-12-03
  • 打赏
  • 举报
回复
1.内存泄露问题:
char *str=new char [20];
str="wudemiao";
new出来的内存空间没有使用,而是让str指向了一块常量区域。后面还没有delete。
2.既然str指向了常量,那么这块内存的值就不应该被修改,可是下面的for循环一直在对这块空间的内容做修改。
3.数组下标越界:
for循环的终止条件是i>0,如果i=1,也满足循环条件,但是str[i-2]就越界了。
bjbjbh 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liux0614 的回复:]
还有对于str="wudemiao" str,对于编译器是常量,不能修改的——
[/Quote]
char *str=new char [20];
str="wudemiao";
是可以修改的吧,str不是常量,可以更改的,char *str=new char [20]是把new返回的地址赋给str

把你报的错误贴出来啊
fancybit 2011-12-03
  • 打赏
  • 举报
回复
用strcpy是生成一个副本 这个副本是个数组 自然是变量 不管C++ C你都不能修改常量啊注意啦!
fancybit 2011-12-03
  • 打赏
  • 举报
回复
char *str=new char[20];//这一句创建了一个20个元素的字符串
str="wudemiao";//这一句你把str指针指向一个字符串常量,上一句创建的那20个字符串现在已经访问不到了,这是内存泄露 很严重的问题
后面你又通过str指针去修稿它引用的常量啊常量!注意第二句你把str放到一个常量上 常量能修改么老大!
Crack 2011-12-03
  • 打赏
  • 举报
回复
说错了使用malloc开辟的又可以使用啊!和new有什么区别呢?数组的也不可以!!!!求解释!!
Crack 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yulinlang 的回复:]

char *str=new char[20];
str="wudemiao";

先定义了一个char *,指向new分配的char[20],
然后str又指向字符串常量"wudemiao",原来的char[20]地址丢失,内存泄漏。
但这还是其次,关键是大部分编译器实现里字符串常量处于只读区,不能修改其内容,
下面的str[0]一类的统统会出错。

所以如楼上,请使用strcp……
[/Quote]
为什么在C语言这样做有可以呢?
huawu001 2011-12-03
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char *str=new char [20];
str="wudemiao";
cout<<strlen(str)<<endl;
cout<<str<<endl;
int N=strlen(str);
int M=4;
char ch;
while(M--){ 将其改为//for(int n=M;n<0;M--){
ch=str[N-1];
for(int i=N-1;i>0;i--)
{
str[i-1]=str[i-2];
}
str[0]=ch;

}
cout<<str<<endl;

}
群狼 2011-12-03
  • 打赏
  • 举报
回复
还有对于str="wudemiao" str,对于编译器是常量,不能修改的——
群狼 2011-12-03
  • 打赏
  • 举报
回复
楼主使用了new却没有使用delete内存泄露了
yulinlang 2011-12-03
  • 打赏
  • 举报
回复
char *str=new char[20];
str="wudemiao";

先定义了一个char *,指向new分配的char[20],
然后str又指向字符串常量"wudemiao",原来的char[20]地址丢失,内存泄漏。
但这还是其次,关键是大部分编译器实现里字符串常量处于只读区,不能修改其内容,
下面的str[0]一类的统统会出错。

所以如楼上,请使用strcpy,strncpy
Crack 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icechenbing 的回复:]

str="wudemiao";能这样搞嘛?用strcpy,strncpy
[/Quote]
有这个啊char *str=new char[20];
怎么不可以啊!你运行试下啊!错误根本不在这里啊!
恨天低 2011-12-03
  • 打赏
  • 举报
回复
str="wudemiao";能这样搞嘛?用strcpy,strncpy

64,318

社区成员

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

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