【问题标题】:constness in c strings [duplicate]c字符串中的常量[重复]
【发布时间】:2012-01-25 03:20:40
【问题描述】:

可能重复:
Modifying C string constants?

据我了解,如果你想创建一个 c 字符串常量,你应该给出如下声明:

const char* str = "hello";

char* const str = "hello";    

但是一个简单的声明,比如:

char* str = "hello"

如果我尝试以任何方式修改字符串 - 比如

str[2] = 'f';

*(str+2) = 'f';

我总是遇到分段错误,这是为什么呢?

另外,如果我做这样的声明

const char* const str = "hello";
str = "bye";  

根据 scott meyers,我正在尝试修改 const 指针,应该得到警告、错误或段错误,但我什么也没得到,代码编译和执行完美。我很困惑,我在 ubuntu 11.10 上使用 g++。

【问题讨论】:

  • 是的,我也很困惑。任何符合标准的编译器都应该拒绝显示的最后一个 sn-p 代码。如果你的没有,它包含一个错误。在责备编译器之前,请确保您没有忽略任何警告。
  • 代码可以正确编译和执行,因为修改字符串文字会导致 未定义行为,这意味着所有安全赌注都已关闭,您的程序可能会工作或者可能会崩溃或显示任何奇怪的行为。未定义的行为意味着程序格式错误,并且可以显示可能会或可能不会被解释的行为。

标签: c++ string


【解决方案1】:
char* str = "hello"

这利用了一个不推荐使用的转换,它允许将字符串文字隐式转换为char*。不要使用这种转换。

字符串文字中的字符仍然是 const,尽管您使 str 指向字符串文字。

const char* const str = "hello";
str = "bye"; 

此代码格式错误。你的编译器应该拒绝它。

如果您的编译器不拒绝此代码或至少不发出诊断消息(警告),则它要么是编译器中的错误,要么是“语言扩展”。

【讨论】:

    【解决方案2】:
    char* str = "hello";
    

    字符串文字hello 位于只读位置,无法修改。编译器应该发出关于标识符 str 初始化的警告。

    要真正修改字符串,你需要做-

    char str[] = "hello"; // Copying the string literal hello to the array str
    
    str[2] = 'f';  // Now these are valid.
    str[2] = 'f';
    

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2010-10-03
      相关资源
      最近更新 更多