当我以下列方式声明时,字符串声明起作用:
URL.revokeObjectURL
但是在以下情况下:
string a = "xyz";
char a[] = "xyz";
它在g ++ 4.9.2编译器中给出了错误:
警告:已弃用从字符串常量转换为'char *' [-Wwrite-strings] char * a =“xyz”;
我认为这三种声明类型彼此不同。请帮帮我。
答案 0 :(得分:2)
string a = "xyz";
这使用初始化程序语法来调用构造函数std::string( const char* )
。
char a[] = "xyz";
这声明了一个足以存储字符串加终结符的数组。它遵循标准的数组初始化规则。可以认为它等同于char a[] = { 'x', 'y', 'z', '\0' };
char *a = "xyz";
这需要一个字符串文字("xyz"
)并将其分配给非常量指针。在语言中,这样的指针意味着可以修改它指向的字符串,但在这种情况下,这是未定义的行为,因为可能不会修改字符串文字。为了防止您犯这样的错误,编译器会给您一个警告。以下内容有效,不会发出警告:
const char *a = "xyz";
答案 1 :(得分:2)
在该语言的早期版本中,您可以使用:
char* a = "xyz";
现在,你必须使用:
char const* a = "xyz";
字符串文字,例如"xyz"
位于程序的rea-only部分。它可用于初始化char const*
,因为您不应该修改char const*
指向的内容。使用它来初始化char*
会打开用户意外修改它们的可能性。此外,修改此类字符串会导致未定义的行为。
字符串文字也可用于初始化char[]
。在这种情况下,字符串文字将复制到为数组分配的空间。因此,不存在修改程序的只读数据的风险。因此,使用
char a[] = "xyz";
没问题。
该行
string a = "xyz";
调用string
的构造函数,该构造函数接受char const*
,然后使用该对象初始化a
。因此,那条线也行。