C语言中指向字符串常量的指针问题

char*p="hello";p[0]='x';printf("%s",p);按理说hello为字符串常量,指针无法修改它的但结果为什么是xello,还是给修改了不明白这... char *p="hello";

p[0]='x';

printf("%s",p);

按理说hello为字符串常量,指针无法修改它的
但结果为什么是xello,还是给修改了
不明白这个

查了C语言参考手册,对这个的解释也是,指针无法修改字符串常量,但如果这么编可能会通过,可能会在运行中出错。

到底怎么回事
展开
 我来答
叹手米d
2008-11-11 · TA获得超过2565个赞
知道大有可为答主
回答量:1977
采纳率:0%
帮助的人:1253万
展开全部
综合以上两位的就是答案了
注意:你这个问题是个特例,在C语言里实际上是可以修改的,且在 TC 下可以通过。如果你用VC,也通过了编译,的确字符串常量是不能修改的,但是编译器并不认为p[0]='x'有任何错误,所以它编译的时候没有问题都,连接也不会有问题,但是运行的时候一定会出错。
也就是能弹一个内存错误。
如果你不想修改它可以加个 const,如:
const char *p = "hello";
这样就不会编译通过了。
兜里有两块糖
2008-11-11 · TA获得超过522个赞
知道小有建树答主
回答量:585
采纳率:100%
帮助的人:506万
展开全部
的确字符串常量是不能修改的,但是编译器并不认为p[0]='x'有任何错误,所以它编译的时候没有问题都,连接也不会有问题,但是运行的时候一定会出错。
也就是能弹一个内存错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
端蒙洋赞怡
2019-09-18 · TA获得超过3758个赞
知道大有可为答主
回答量:3083
采纳率:33%
帮助的人:173万
展开全部
第一个:char
*p
=
"123456";
char
*s
=
"asdghh";
*s
=
*p;
你这个之所以会错,是因为指针s指向的是常量字符串
asdghh
而*s=*p相当于改变常量字符串的值,常量是不能改变的,而且常量也不能做左值,所以出错。
第二个:
char
a[]="123456";//这个的意思是
在内存充开辟空间
把常量字符串复制到这个空间
char
*p
=
a;//这个说明指针p存储的是数组变量a的地址
char
a1[]="asdghh";
//同上
char
*s
=a1;
//同上
*s
=
*p;
//
这句的意思是
把指针p所指向空间的值(这里为数组a)复制到指针s所指向的空间(这里为数组a1)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
闻鸡休息
2008-11-11 · TA获得超过351个赞
知道小有建树答主
回答量:243
采纳率:0%
帮助的人:265万
展开全部
注意:你这个问题是个特例,在C语言里实际上是可以修改的,且在 TC 下可以通过。如果你用VC,你将不会通过编译。
如果你不想修改它可以加个 const,如:
const char *p = "hello";

这样就不会编译通过了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
03013110
2008-11-11 · TA获得超过529个赞
知道小有建树答主
回答量:1216
采纳率:0%
帮助的人:392万
展开全部
你用的什么编译器?我写的?居然有这种bug!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式