为什么我可以将字符串字面值赋值给char*指针

why can I assign a string literals to a char* pointer

本文关键字:char 指针 赋值 字面值 我可以 字符串 为什么      更新时间:2023-10-16

我认为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 %cn", *cp);
}
getch();
return 0;

那么为什么这里可以将const char*赋值给char*呢?

这个问题是在vc++下,但在GCC中它有一个有意义的警告:

警告:从字符串常量到'char*'的转换已弃用(-Wwrite-strings)

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

char *str2 = "this is good";

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

字符串字面值确实是常量。但是,数组会衰变成指针,并且您使用了指向数组第一个元素的非const指针:

char *str2 = "this is good";

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

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

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

[conv.array]

非宽字符串字面值(2.13.4)可以转换为"指针指向"类型的右值

字符";

实际上,任何窄字符串字面值都是"n个const char的数组"类型,但正如你在上面看到的,有一个(已经在c++ 03中弃用)功能可以隐式地将它们转换为char *类型的右值。

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