const char* str="abcd" 与 char* str="abcd"有区别吗?该怎么处理

const char* str="abcd" 与 char* str="abcd"有区别吗?
const char* str="abcd" 与 char* str="abcd"有区别吗?


------解决方案--------------------
引用楼主 gaomingok 的帖子:
const char* str="abcd" 与 char* str="abcd"有区别吗?


------解决方案--------------------
4楼这种所谓的合法性,其实只是编译器在编译时的伪报的合法,其实是不合法的
这是为了兼容老代码留下的一个“bug”,实际上第二种情况是一种错误表达式,只是如果把它mark成错误,很多很多C语言程序都要改,所以编译器才容忍了这种错误。好的程序员只写第一种
探讨
引用楼主 gaomingok 的帖子:
const char* str="abcd" 与 char* str="abcd"有区别吗?



区别就是

char p[] = "1234";;

const char* str="abcd"
str = p;
str[2] = '1';非法


char* str="abcd"

str = p;
str[2] = '1'; 合法

------解决方案--------------------
要记住:标准也是在妥协下的产物,标准上允许的不一定是正确的。
我没有读过C++标准,我也从来不是一个标准的拥趸,泛标准论本来就不是什么好事情

不过我相信在这方面我没法说服你,因为你很可能还没有理解软件工业化的许多痛苦,还是很坚持“标准”的。

我们假定标准规定char * a ="abcd"合法,那么标准自己是矛盾的。大家都知道"abcd"不是变量(如果你反驳,我就说什么都白搭),一个常量是不可能有非常量的地址的,而这个表达式的左侧是一个存储非常量地址的指针,标准怎么解释这种矛盾?

我还想说一个事实,char * a= "abcd",依赖编译器的不同,"abcd"放的位置可能是只读存储区,在这种情况下a[2] = 'b'也许不会导致语法错误,但是会导致程序崩溃

如果标准允许你这样写,要么是标准有bug,要么编译器不完全符合标准。然而在实际生产中,是否符合标准不是最重要的,程序不崩溃才是最重要的,因此如果编译器不支持标准某个特殊规定,那么标准就不能使用。
探讨
我不知道你说的char* str="abcd" 那里不合法了?? 那里表明了不符合C/C++标准?

------解决方案--------------------
在C++中
"aaa..."
的类型明确是array of n const char
在C中
没有提及其类型.

C/C++
对于相同的string literatl是否具有相同的存储,都是实现定义的.

C/C++
修改一个string literal是未定义的.

C/C++
存储都是static的

因此,
在类型系统的方面:
从C的角度来看,两都可以是正确的.
从C++的角度来看,array of n const char to pointer to char这一步是有容忍的.
在实际行为的方面:
两者都是容忍性的.