为啥允许将字符串文字分配给 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 数组元素时,分配的字符被破坏?

将字符串文字分配给 char* [重复]

将'\'分配给char [重复]

将字符串*分配给char * c ++ [关闭]

将一个int(例如10)分配给c ++中结构中的字符串成员,为啥它编译成功?

为啥在java中不允许分配给'this'?