4

我认为字符串中的文字c++const char*. 而且您不能将const char*对象分配给non-constant char*对象。但在 Visual Studio 2010 中。以下代码可以编译而不会出现错误或警告,但会产生运行时错误。

int main(void)
{      
    char *str2 = "this is good";
    str2[0] = 'T';
    cout << str2;
    getchar();
    return 0;
}

而如果我们不修改字符串的值,读取值是可以的:

for(char *cp = str2; *cp !=0; ++cp) {
    printf("char is %c\n", *cp);
}
getch();
return 0;

那么为什么我们可以在这里将 const char* 分配给 char* 呢?

4

3 回答 3

5

问题在 VC++ 下,但在 GCC 中有一个有意义的警告:

警告:不推荐将字符串常量转换为 'char*' [-Wwrite-strings]

此警告意味着编译器将应用隐式转换,尽管有 const/non-const 差异。所以,这段代码是可以的(在运行时没有任何修改):

char *str2 = "this is good";

但是,修改str2会产生未定义的行为。

于 2013-04-12T11:38:01.857 回答
1

字符串文字确实是恒定的。但是,数组衰减为指针,您将非const指针指向数组中的第一个元素:

char *str2 = "this is good";

修改 const char 数组的任何值都会产生未定义的行为。

这不会在 gcc 4.7.2 下编译干净。如果在 MSVC 下将警告级别提高到警告级别 4,它也可能会在那里发出警告。

于 2013-04-12T11:35:12.373 回答
1

让我们看一下 C++03 而不是 C++11:

[conv.array]

不是宽字符串文字的字符串文字(2.13.4)可以转换为“pointer to char”类型的右值;

实际上,任何窄字符串文字都是“n const char 数组”类型,但正如您在上面所读到的,有一个(在 C++03 中已弃用)功能可以将它们隐式转换为 rvalues 类型char *

仍然不允许您更改字符串的内容,就像您做了一样const_cast:指针指向的对象已被声明为 const,因此不允许修改(未定义的行为)。

于 2013-04-12T11:56:44.987 回答