为啥允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复]
Posted
技术标签:
【中文标题】为啥允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复]【英文标题】:Why string literals are allowed to be assigned to pointer of type char * in C++ [duplicate]为什么允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复] 【发布时间】:2017-10-27 14:50:17 【问题描述】:使用 Visual Studio,我声明了一个 char *
类型的指针,并为其分配了一个字符串文字。然后我将鼠标悬停在字符串文字上,它显示了它的类型:(const char [4])"abc"
。
这是怎么允许的?它编译时没有警告或错误,同时为指针分配const char []
类型的数组失败,原因很明显,并显示错误消息:
“const char *”类型的值不能分配给“char *”类型的实体
那么,为什么允许字符串字面量?
int main(void)
char *p = "abc"; // no error here
const char str[] = "abc";
//p = str; This line generates an error
return 0;
【问题讨论】:
错误信息的哪一点你不明白?const char *
与 char *
不同。
并将其分配给字符串文字。不,您已分配给它。
您没有将指向 char 的指针分配给字符串文字。
您使用的是哪个版本的 Visual Studio?
@NeilButterworth OP 询问为什么 VS 编译该代码没有引发警告或错误
【参考方案1】:
编辑:已更新答案以包含 Story Teller 评论中的信息。
在过去,const
并不存在,人们一直在写 char* p = "abc"
这样的东西。只要他们不做类似p[0] = 'z'
的事情,他们的程序就可以工作。为了与此类代码保持兼容,如果您不要求编译器是超严格的,一些编译器允许将字符串文字分配给非常量指针。如果您利用此功能,您仍然不应该实际修改字符串。
【讨论】:
嗯,没有。字符串文字是 const。正如问题所说,"abc"
的类型是const char[4]
。
讲故事的人:当我试图引用你时,删除你的评论是不公平的! :)以上是关于为啥允许将字符串文字分配给 C++ 中 char * 类型的指针 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 c++ 中分配 char 数组元素时,分配的字符被破坏?