【问题标题】:Why char *s = "string" shows no error or warning when it is not const为什么 char *s = "string" 不是 const 时不显示错误或警告
【发布时间】:2015-02-02 11:05:48
【问题描述】:

下面一行

char *s = "string";

即使使用-Wall,也不会在gcc 上引发任何警告/错误。

AFAIK,指针 s 直接指向 .rodata 的某些部分,使其成为指向 const char 的指针。

那么,为什么指针不抱怨和期待:

const char *s = "string";

Plus:无论如何,使用后者是不是更好的做法?

【问题讨论】:

  • @Dan ,只读数据?
  • @CoolGuy 我猜是这样,但我对这个符号感到惊讶。

标签: c pointers constants


【解决方案1】:

来自 gcc 编译选项:

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

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

【讨论】:

    【解决方案2】:

    理想情况下,任何修改字符串文字内容的尝试都是未定义行为。因此,始终鼓励在声明字符串文字时使用const

     const char *s = "string"; 
    

    而不是,

     char *s = "string";    
    

    事实上,在C++ 中不推荐使用不带const 的字符串文字,尽管C 中没有。但是,使用 const 声明字符串文字会给您带来好处,即编译器通常会在您尝试在第二种情况下修改字符串文字时向您发出警告。

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2016-06-25
      • 2021-06-23
      • 2021-11-24
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多