为什么我可以将字符串字面值赋值给char*指针
why can I assign a string literals to a char* pointer
我认为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,因此不允许修改(未定义行为)。
相关文章:
- 构造函数 (C++) 中的 char 指针参数存在问题
- 将 char 指针传递给接受对 char 数组的引用的函数
- 分配值时,C++ char* 指针上的前递增与后递增
- char指针或char变量的默认值是多少
- 为什么为char指针分配内存不会截断char序列
- 愚蠢的问题:strcat和char指针
- 使用 ctypes 从函数返回字符串C++会给出大的 int,而不是 char 指针
- 打印char指针的Unicode和文本值
- 应对 std::字符串中的 std::<char>指针转换后的向量
- 一系列char指针
- 为什么可以将Char指针变量初始化为字符串,而INT指针变量不能初始化到整数数组
- 将char指针传递给cin和cin.get()
- 在C和C++中,将int值转换为char指针的差异
- std :: cout null char*指针中止该程序
- char指针违反访问权限
- const char指针在结构中声明
- 将字符串转换为 char 指针可以指向的 char 数组/值的最有效方法是什么
- 将Char指针数组传递到C 中的函数
- 获取错误C2440:char []* char*(指针)
- 删除Char指针在destructor中不起作用