为啥“char*”可以指向“const char*”?

Posted

技术标签:

【中文标题】为啥“char*”可以指向“const char*”?【英文标题】:why a "char*" can point to a "const char*"?为什么“char*”可以指向“const char*”? 【发布时间】:2011-11-29 06:39:42 【问题描述】:

以下代码在VC或gcc上都可以正确编译:

char *str = "I am a const!";
str[2] = 'n';

但是,显然存在运行时错误。因为“我是一名警察!”是一个const char*,为什么编译器没有给出错误甚至警告??


另外,如果我定义char a[] = "I am const!"a中的所有元素都可以修改,为什么这次字符串文字变成nonconst

【问题讨论】:

因为在 C 中,字符串文字不是(如您所断言的)const char *s。 (在 C++ 中,它们也不是 const char *s。它们是数组,而不是指针,它们是 const。) 你用的是什么编译器?在 gcc 中,设置警告标志-Wwrite-strings 抱歉,在我的redhat上,gcc提示“cc1: unrecognized option `-Wfixed-strings'” @Flybywind ooh 不知道——您可能需要更新 GCC:P 标志是-Wwrite-strings。 gcc.gnu.org/onlinedocs/gcc/Warning-Options.html 【参考方案1】:

就 C 而言,该字符串文字不是 const,它是一个 char[14],您将其分配给一个 char*,这非常好。

但是,C 确实说更改字符串文字是未定义的行为。

【讨论】:

+1 但应该注意,混淆可能来自 C++,其中字符串文字 const. 我还是不明白,既然字符串文字只是char[],不是const,那为什么我不能改变值呢? @Flybywind:因为语言是这样说的。 C 语言的规范清楚地表明字符串字面量是不可修改的,即使它们不是const 这是因为 const 从 C++ 向后移植到 C。在 const 被发明之前,字符串文字是不可变的。 @Flybywind:在这种情况下,这是因为字符串文字是一个数组初始值设定项。相当于char a[] = 'I', ' ', 'a', 'm'...

以上是关于为啥“char*”可以指向“const char*”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 const QString& 参数返回错误的 const char* 指向数据的指针

const char * char const * char * const 三者的区别

const char * char const * char * const 三者的区别

const char* a 与 char* const b 的区别

为指向 const 的指针赋值 指向 const char 的指针 (const char * const * p)

可以/为啥在返回类型中使用 char * 而不是 const char * 会导致崩溃?