【问题标题】:String Declaration字符串声明
【发布时间】:2016-02-03 05:00:49
【问题描述】:

当我通过以下方式声明时,字符串声明有效:

string a = "xyz";
char a[] = "xyz";

但在以下情况下:

char *a = "xyz";

它在 g++ 4.9.2 编译器中出现错误:

警告:不推荐将字符串常量转换为“char*” [-Wwrite-strings] char *a = "xyz";

我认为这三种声明类型彼此不同。请帮帮我。

【问题讨论】:

  • 这是一个警告,而不是一个错误。 “警告”这个词就是线索。

标签: c++ string pointers stl


【解决方案1】:
string a = "xyz";

这使用初始化语法来调用构造函数std::string( const char* )

char a[] = "xyz";

这声明了一个足够大的数组来存储字符串和终止符。它遵循标准的数组初始化规则。认为它等同于char a[] = { 'x', 'y', 'z', '\0' };

char *a = "xyz";

这需要一个字符串文字 ("xyz") 并将其分配给一个 非常量 指针。在语言中,这样的指针意味着可以修改它指向的字符串,但在这种情况下这是 未定义的行为,因为字符串文字可能不会被修改。为了防止你犯这样的错误,编译器会给你一个警告。以下是有效的,不会发出警告:

const char *a = "xyz";

【讨论】:

    【解决方案2】:

    在该语言的早期版本中,您可以使用:

    char* a = "xyz";
    

    现在,你必须使用:

    char const* a = "xyz";
    

    诸如"xyz" 之类的字符串文字驻留在程序的只读部分中。它可用于初始化 char const*,因为您不应该修改 char const* 指向的内容。使用它来初始化 char* 会打开用户意外修改它们的可能性。此外,修改此类字符串会导致未定义的行为。

    字符串文字也可用于初始化char[]。在这种情况下,字符串文字被复制到为数组分配的空间中。因此,不存在修改程序只读数据的风险。因此,使用

    char a[] = "xyz";
    

    没问题。

    线

    string a = "xyz";
    

    调用string 的构造函数,该构造函数接受char const*,然后使用该对象初始化a。因此,那条线也可以。

    【讨论】:

    • 我不明白为什么这个答案被否决了。它清晰、正确,甚至提供了一些历史记录。
    • @paddy,我也没有。希望他们能解释一下:)
    • RSahu 和@paddy 您的回答都对我理解问题有很大帮助。谢谢你的回复。 :)
    • @biswasJUCSE,很高兴我们能够提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-01-03
    • 2010-12-31
    相关资源
    最近更新 更多