char* 指向内容不能修改的问题(整理)

转载 2015年07月08日 11:11:09

char* str = "resource";

str[6] = 'k';  //这句报内存写入错误

*(str+6) = 'k'; //这样写同样报错

但是这样就没问题:

char* str = new char[12];

strcpy(str, "resource");

str[6] = k; //没问题

*(str+6) = 'k'; //没问题

复制代码

 这样也没问题:

char str[] = "resource";

str[6] = 'k';

*(str+6) = 'k';

从网上搜寻资料后,找到了一个比较准确的解答(斜体为网上内容,来源:http://bbs.chinaunix.net/viewthread.php?tid=1084610&page=1#pid8256820):

"resource"是字符串常量。

对于 char *str = "resource";

把"resource"的值----也就是字符串常量字面值,也就是"resource"的地址,准确来说是起始地址----赋给字符指针 str,Linux下,"resource"字符串常量是存放于只读数据区的,一般来说,32位机器上,在Linux中,堆,全局数据,常量等都是存放于从0x8048000开始的内存地址,向上增长。可以打印一下"resource"的地址来进行验证。char *str = "resource",就是把"resource"的首地址赋给str,所以str 存放的是一个只读数据区的地址,对只读区的数据进行写操作是禁止,具体由相应的操作系统进行判断以及处理。


而对于 char str[] = "resource";

str[]是一个字符数组,编译器首先在栈中分配一定的连续空间用于存放“resource”中的字符以及结尾符,然后把字符串常量的内容,也就是
"resource"中的各个字符和结尾符复制到这个栈中的连续空间中
。str是数组名,用来表示这个连续栈空间的起始地址,所以str中存放的是栈地址,这个地址的数据是可写的。一般来说,32位机器上,在Linux中,栈地址空间从3G(0xbfffffff)开始向下增长。

可以用语句printf("%x\n", str)来打印出str中存放的地址,来验证一下这个地址属于栈还是属于只读数据区。


而对于char* str = new char[12];

由于重新分配了内存,然后将常量字符串内容拷贝过来,这样str指向的不是只读数据区,也就可以修改了。

但是要注意的是,下面的代码也是不行的:

char* p = new char[12];
p
= "resource";
p[
6] = 'k'; //报错
或许通过我的这个例子大家可以更容易的理解这个问题,在编译器调试状态下,可以很容易地看到,刚分配完内存的p的地址与给p赋值后的地址明显不同,所以经过后一个赋值语句后,p又重新指向了只读内存区,所以又不能修改了!

char* 指向内容不能修改

char* str = "resource";   str[6] = 'k';  //这句报内存写入错误   *(str+6) = 'k'; //这样写同样报错   但是这样就没问题:   char*...
  • u014638988
  • u014638988
  • 2015年02月12日 23:29
  • 718

char*指向内容不能修改的问题

char*指向内容不能修改的问题 计算机等级考试  更新人:evans   更新时间:2012-7-13 -   同事遇到一个简单的问题:   ch...
  • jiafu1115
  • jiafu1115
  • 2013年11月27日 17:57
  • 420

char* 指向内容不能修改的问题

None
  • zhongjiekangping
  • zhongjiekangping
  • 2010年06月04日 13:58
  • 934

char* 指向内容不能修改的问题(整理)

同事遇到一个简单的问题:   char* str = "resource"; str[6] = 'k';  //这句报内存写入错误 *(str+6) = 'k'; //这样写同样报错 ...
  • piaopiaopiaopiaopiao
  • piaopiaopiaopiaopiao
  • 2014年09月14日 22:03
  • 336

char* 修改问题

不能修改! 关键问题是: char *p="hello“; 以这种方法初始化的字符串是常量字符串,所以不能修改。 char p[]="hello“; 这是变量,可以修改! char *p=new ...
  • Sayesan
  • Sayesan
  • 2014年02月21日 12:47
  • 1016

char *指向的内容不可修改

c语言不够扎实,学c++和linux时会遇到一些奇怪的问题。 在学信号时,演示代码 char *str = "resource"; str = 'H'; 报了段错误。一下子不能理解,为啥str指向的内...
  • sodawaterer
  • sodawaterer
  • 2017年02月10日 11:22
  • 114

char * 指向的字符串不能修改

自己学习的时候也对这个感到过困惑,mark一下,希望给大家一点帮助,也方便自己回顾 看几个例子把 这个会报错,然后终止运行。 为什么不行呢? 问题就出在这char *str = "acb...
  • qq_31779399
  • qq_31779399
  • 2016年05月12日 23:47
  • 118

关于C语言char *指向的字符串

在做一些小测试的时候,发现一些C语言char *指向的字符串相关问题,原来的代码如下:      char *a = "hello";      char b[] = "word"; ...
  • cdhql
  • cdhql
  • 2014年03月04日 20:36
  • 2940

char *p[10] 和 char (*p)[10]

char *p[10] “[“的优先级高于”*” 意味着p是一个有十个元素的数组 元素的类型是 char* char (*p)[10] “(“的优先级最高 意味着p是一个指针...
  • FANGWK
  • FANGWK
  • 2016年11月16日 14:52
  • 545

指针就算指向了常量也不能修改这个常量

先来看我这个低级的错误代码#include int main(int argc, char *argv[]) { char *ch1,*ch2; int i=0; ch1="you are ...
  • rockpk008
  • rockpk008
  • 2015年10月25日 01:09
  • 567
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:char* 指向内容不能修改的问题(整理)
举报原因:
原因补充:

(最多只允许输入30个字)