【问题标题】: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 编译该代码没有引发警告或错误

标签: c++ string pointers compiler-errors


【解决方案1】:

编辑:已更新答案以包含 Story Teller 评论中的信息。

在过去,const 并不存在,人们一直在写 char* p = "abc" 这样的东西。只要他们不做类似p[0] = 'z' 的事情,他们的程序就可以工作。为了与此类代码保持兼容,如果您不要求编译器是超严格的,一些编译器允许将字符串文字分配给非常量指针。如果您利用此功能,您仍然不应该实际修改字符串。

【讨论】:

  • 嗯,没有。字符串文字是 const。正如问题所说,"abc" 的类型是const char[4]。
  • 讲故事的人:当我试图引用你时,删除你的评论是不公平的! :)
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多