访问字符指针
accessing character pointer
在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]
需要在那里写入。
至于你的第二段代码——缺少了一些东西,所以问题的一部分是不清楚的。
因为指向字符的指针不是array
和low-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;
- 指向指向字符数组的指针数组的指针
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将字符缓冲区强制转换为函数指针
- 在函数中返回无符号字符数组,但不返回指针
- 将字符逐个分配给指针?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将字符数组复制到 QByte 数组中,而无需传递指针
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- C++指针数组到字符数组中的特定位置
- 如何从链表指针字符中查找字符
- 获取字符数组地址,然后转换为指针字符
- 在指针字符 c++ 中分配字符数组的值
- C 指针字符
- 将向量传递<char>到指针字符*
- 如何修复未对齐的指针(字符**)
- 如何打印指针字符数组
- 指针 *字符和 &字符
- C++指针字符
- C/ c++:从指针字符一维数组中访问单个字符