关于字符串指针指向内容不能修改的问题

char *s = "sjdkjfl";
s[3] = 'd';

上面的程序在编译的时候出现问题,而当改成下面数组样式的时候则通过了编译。

char s[] = "sjdkjfl";
*(s+2) = 'd';
在水源上提问,有大神回答

char * s = "sjdkjfl";
在内存空间里是分配到“只读内存区”

char a[] = "sjdkjfl";
则是以堆栈的形式(局部变量,若是全局变量则存在全局变量区)存在,是可以被修改的。
同时,引号包含的字符串都是不能被修改的,所以用数组形式其实是执行以下代码:
char a [strlen("sjdkjfl")+1];
memcpy(a, "sjdkjfl", strlen("sjdkjfl")+1);


下面用The C Programming Language的说明来进一步理解(p90)

char a[] = "now";
char *p = "now";

指针a始终指向一个存储位置,指向的位置不能修改,并且数组中的单个字符可以进行修改;而指针p可以被修改指向其他地址,但如果试图修改字符串的内容是没有定义的。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值