访问字符指针

accessing character pointer

本文关键字:指针 字符 访问      更新时间:2023-10-16

在c++中,为什么编译器不允许将下列字符指针修改为

#include <iostream>
int main()
{
char* cp = "overflow";
cp[1]='p';
return 0;
}

输出:运行时崩溃

但是字符数组允许,

#include <iostream>
int main()
{
char cps[] = "overflow";
cp[1]='p'; // this compiles fine and output is operflow
return 0;
}

只是想知道运行时发生了什么以及为什么它会崩溃。谢谢你。

字符串字面值是char const[]类型的左值,其中const是重要的部分。试图修改类型为const的对象是未定义行为.

根据c++ 11标准第2.14.5/8段:

普通字符串字面值和UTF-8字符串字面值也被称为窄字符串字面值。狭窄字符串字面值的类型为"array of n const char",其中n是下面定义的字符串的大小,并且具有静态存储时间(3.7).

在第二种情况下(假设你指的是char cps[] = "overflow";,用方括号括起来),你初始化的是字符串文字的非const 副本。修改副本是可以的。

还要注意,从字符串文字到非-const char *的转换在c++ 03中已弃用,在c++ 11中是非法的。另一方面,这是合法的:

char const* cp = "overflow";
//   ^^^^^

这:char* str="";,是一个字符串文字,可能存储在内存的只读部分,因此可能崩溃。使用const char* const str="string";(指针和数据都是常量或至少数据应该是常量:const char* str="string";char const* str="string";)

如果您尝试更改字符串文字的内容,则可能发生未定义行为和分割错误,从而导致崩溃。

当您设置char* cp = "overflow";时,您正在创建一个包含"overflow"的只读内存块(后跟一个NULL终止字节),因此您不能在那里写入。尝试更改c[x]需要在那里写入。

至于你的第二段代码——缺少了一些东西,所以问题的一部分是不清楚的。

因为指向字符的指针不是arraylow-level const。你可以写

char cp[] = {'o', 'v', 'e', 'r', 'f', 'l', 'o', 'w', ''};
char *pcp = cp;
*++pcp = 'p';

但是,"overflow"是一个不可修改的常量字符序列,因此您只能执行指针算术和对值的指针解引用。

char *cp = "overflow";
std::cout << *++cp std::endl;