为什么当char *s = "字符串"不是const时,不会显示错误或警告

3
以下是需要翻译的内容:

下面这行代码

char *s = "string";

即使使用-Wall,在gcc上没有任何警告/错误。

据我所知,指针s直接指向.rodata的某个部分,使其成为指向const char的指针。

那么,为什么指针没有抱怨和期望:

const char *s = "string";

附加内容: 无论如何,使用后者难道不是更好的做法吗?


@Dan,只读数据? - Spikatrix
@CoolGuy 我想是这样,但是我对这个符号表示感到惊讶。 - Daniel Daranas
2个回答

8

从gcc编译选项中:

-Wwrite-strings 在编译C时,将字符串常量的类型设置为const char[length],以便将其地址复制到非const char *指针中产生警告。这些警告可以帮助您在编译时找到可能尝试写入字符串常量的代码,但前提是您在声明和原型中非常小心地使用了const。否则,它只是一个麻烦。这就是为什么我们没有使-Wall请求这些警告的原因。

所以显然你需要明确允许-Wwrite-strings,而Wall不包括它。


2
理想情况下,任何修改字符串字面值的尝试都是未定义行为。因此,在声明字符串字面值时始终建议使用const
 const char *s = "string"; 

替代,

 char *s = "string";    

事实上,在C++中,声明一个没有const的字符串字面量已经不被推荐使用,虽然在C中还可以。但是,在第二种情况下使用const来声明字符串字面量有一个优点,那就是编译器通常会给出警告,以防止您尝试修改该字符串字面量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接