为啥“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 的区别