C++中不能把字符串常量赋值给字符型指针?看下面的图片

一运行就出错,求解... 一运行就出错,求解 展开
 我来答
kingdjh
2015-07-17 · TA获得超过955个赞
知道小有建树答主
回答量:939
采纳率:66%
帮助的人:828万
展开全部

char *p="abc"

这样定义编译器默认把abc当做常量,也就是等价于

const char *p="abc"

你用strcat,就改变了p1的值了,所以报错

解决方法如下:

方法一:

char s1[]="abc", s2[2]="def";
char *p1, *p2;
p1=s1;
p2=s2;
strcat(p1, p2);

方法二:

把程序用Release编译看看可以用不,VC6下Debug模式下式常量,Release就是普通变量了

追问
此乃大神也....追问:字符串常量不是存储在ram里的静态存储区的嘛,那char *p1="abc"实际不就是指向静态存储区的嘛,为什么不能修改静态存储区的内容呢?char *p1="abc"等价于const char *p1="abc"有点牵强吧?
追答
debug模式下调试器有常量检测,实际内存哪里会知道你是不是常量,所以在release模式下式可以运行的
不让你以为为什么debug编译的程序会比release编译的程序大这么多,就是因为多了很多专门给调试器用的代码
帐号已注销
推荐于2016-07-29 · TA获得超过3954个赞
知道大有可为答主
回答量:1636
采纳率:77%
帮助的人:1222万
展开全部
运行出错是因为你试图将p2所指的字符串拼接到p1所指的字符串(strcat),这两个字符串都是常量,所以运行就出错了。

你编译时出现警告是因为你将字符串赋值常量给char类型的指针。在C++中,字符串常量的类型是 "const char [n]" (n是字符串的长度+1),所以出现类型不匹配,但是为了向后兼容C语言,所以编译器只给了警告。
追问
大神啊,为什么一运行就出错呢?很多资料都说const量是可以通过指针来修改其对应内存的值的,我这儿又不是直接把两个字符串放在strcat里,我是把两个地址放在strcat里啊,为什么不能修改内存单元的值呢?
追答

    C++标准中的const常量是不能被修改的,如果试图通过非const指针或者引用来修改,修改的结果是未定义的。编译器会根据这条规则const常量进行优化,比如const常量放置在寄存器中、只读存储区、或者内存中的只读存储区,所以任何修该const常量的值的操作,其结果都是由实现定义的。

 

看看下面的代码:


这段代码在Visual Studio 2015上的运行结果是:

在DEV C++5.11上的运行结果:

运行结果并不是期待的45 20,这是因为上面的代码使用了非法的方式修改了const常量,在现代的硬件体系和编译实现,不要依赖非标准的操作。



strcat函数要把第二个参数指向的字符串存储到第一个参数指向的字符串的末尾,由于第一个参数指向的字符串是常量,所以会出现运行时错误。


这是strcat函数的介绍:

图片上说的很清楚:第一个参数的类型是char*(不是const char *),而且第一个参数所指向的内存空间必须有足够大的空间来保存第一个字符串和第二个字符串的拼接。


我上面已经说过了字符串常量可以隐式转换为char *,所以字符串常量就可以传递给这个函数。但是字符串常量的存储空间是固定的(等于字符串的长度+1),并且它的存储空间不能被修改,所以你的程序就运行时蹦掉了。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
skypee1234
2015-07-17
知道答主
回答量:11
采纳率:0%
帮助的人:3.2万
展开全部
指针只是代表了一个地址,你定义一个指针变量的时候并没有开辟内存,char *p = "abc"; 这种写法相当于char *p; p = "abc";这明显是不对的,p是指针变量,能给p赋值的一定是地址,相反这样写 char s[10] = "abc..."; char *p = s;这样写就可以通过编译了,因为s表示的是字符串abc...的首地址
追问
唉   小弟啊    “abc”的返回值是a的地址你不知道吗???????
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式