关于char *p="This is read only?\n"

dengmyc 2011-05-23 11:29:07
我测试一了一段这样的小代码,编译多可通过,运行到delete [] pChar;出现内存错误
代码如下:
char *pArr = new char[255];

pArr="This is read only?\n";//这里的"This is read only?\n"是不是分配在只读区?
cout<<pArr<<endl;

delete [] pArr;//这里运行时有问题,注解了这句就可以正常工作

...全文
87 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
woody10074026 2011-05-23
  • 打赏
  • 举报
回复
我最近还研究过这个问题——给char*复制字符串字面值要尤其小心,指针指向的地方是常量区。
比如:
char *p = "This is a test";
//p[0] = 'a'; 这样是不行的,不能对p指向的区域进行写操作
char str[20] = "This is another test";
p[0] = 'a'; //这样就没问题

总而言之,让非const指针指向字符串常量,会起到让指针变为const指针的效果,不能再对指针指向的区域进行修改。但是数组就不存在这个问题,貌似只会把字符串常量复制到数组里。
任何涉及字符串字面值常量,都推荐使用strcpy函数,这是最安全的做法。
另外,字符串字面值常量在编译后,到底是放在什么地方?是内存里的只读区吗?还是直接在运算时出现在寄存器之类的地方?
yrw8888888 2011-05-23
  • 打赏
  • 举报
回复
来晚了...
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dengmyc 的回复:]

有什么办法,让"This is read only?\n"存于堆上
如果不用pArr[0]='T';pArr[1]='h';.....pArr[x]='\n'这样是可以的,但这也太费力了
请高人帮忙解释
[/Quote]

char *str = "This is read only?\n";
char *pArr = new char[strlen(str)+1];
memset(pArr, 0, strlen(str)+1);
memcpy(pArr, str, strlen(str));
昵称很不好取 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dengmyc 的回复:]
除了strcpy()没有在不改变char *pArr=new[255]; pArr = "This is read only?\n";这里有更好的办法吗,比如人为将"放在非只读区上"并用pArr指向
[/Quote]
没听明白,直接pArr="This is read only?\n";肯定是放在只读区,还有就是放在栈上,这就需要用数组
要想放在堆上必须先申请堆然后再赋值
dengmyc 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]

pArr被改变了,不是原始的pArr了
[/Quote]的确改变了,为什么C++会做出这种事情~~~
dengmyc 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 thefirstz 的回复:]

pArr="This is read only?\n";
这句就造成了内存泄露,本来pArr指向分配的255字节内存空间,现在又被指向这个只读的字符串,导致原来分配的内存空间成为黑洞,因为现在pArr指向的空间不是new出来的,故用delete释放就会出错
[/Quote]除了strcpy()没有在不改变char *pArr=new[255]; pArr = "This is read only?\n";这里有更好的办法吗,比如人为将"放在非只读区上"并用pArr指向
dengmyc 2011-05-23
  • 打赏
  • 举报
回复
有什么办法,让"This is read only?\n"存于堆上
如果不用pArr[0]='T';pArr[1]='h';.....pArr[x]='\n'这样是可以的,但这也太费力了
请高人帮忙解释
  • 打赏
  • 举报
回复
char *pArr = "This is read only?\n";这样的话,就在只读区,而没有上面的所谓的分配内存的那句
昵称很不好取 2011-05-23
  • 打赏
  • 举报
回复
要给pArr赋值,可以使用楼上说的strcpy,或是strncpy之类的函数
昵称很不好取 2011-05-23
  • 打赏
  • 举报
回复
pArr="This is read only?\n";
这句就造成了内存泄露,本来pArr指向分配的255字节内存空间,现在又被指向这个只读的字符串,导致原来分配的内存空间成为黑洞,因为现在pArr指向的空间不是new出来的,故用delete释放就会出错
bdmh 2011-05-23
  • 打赏
  • 举报
回复
pArr被改变了,不是原始的pArr了
就想叫yoko 2011-05-23
  • 打赏
  • 举报
回复
strcpy(pArr, "This is read only?\n");
ouyh12345 2011-05-23
  • 打赏
  • 举报
回复
pArr="This is read only?\n";//这里的"This is read only?\n"是不是分配在只读区?
指针重指向了

用strcpy

64,637

社区成员

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

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