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编译的程序大这么多,就是因为多了很多专门给调试器用的代码
大神啊,为什么一运行就出错呢?很多资料都说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),并且它的存储空间不能被修改,所以你的程序就运行时蹦掉了。
唉 小弟啊 “abc”的返回值是a的地址你不知道吗???????