指向字符串的指针无法更改字符
Pointer to String Fails to Change Character
为什么我可以更改指针p
中的元素,但不能更改指针r
中的元素?我猜它一定与指针的属性有关。
将p[2]
改为w
使Gowdbye。更改r
会使代码崩溃。
p
的地址是0x69fee0
。
r
的地址是0x69fedc
。
两者都在 for 循环中具有相同的输出(除了单词"再见"结束后的垃圾数据(。
int main()
{
char q[]="Goodbye";
char* p = q;
char* r = "Goodbye";
cout<<"Address of p: "<<&p<<endl;
cout<<"Address of r: "<<&r<<endl;
for(int i = 0; i<10; i++)
{
cout<<"P["<<i<<"]: "<<p[i]<<endl;
cout<<"R["<<i<<"]: "<<r[i]<<endl;
}
p[2]='w';
cout<<p<<endl;
r[2]='w';
cout<<r<<endl;
return 0;
}
区别在于q
是一个(可变(数组,它用字符串文字"Goodbye"
的"副本"初始化,而r
是指向(不可变(字符串文字本身的指针。更改字符串文本是未定义的行为(因此可能会崩溃或执行其他操作(。
此故障的原因是 * 和 [ ]之间的差异:-
实际的区别在于,当我们声明 *r = "再见" 编译器会将再见放在只读部分 内存并返回指向该位置的指针 将被放置在字符指针和任何写入操作中 将导致分段错误
但是 Q[] 将为字符分配内存位置 然后将字符复制到该位置和位置 是可写的,因此任何修改都是有效的。
相关文章:
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将(N 个字节)无符号字符指针转换为浮点数和双 C++
- 字符指针的 Qt 数组
- C++将常量字符* 指针数组传递给对象
- 为什么不能将字符指针定义为数组?
- 在函数内初始化无符号字符指针将返回空指针
- 将字符指针存储到容器中
- 为什么 strtok_r() 只接受字符数组而不接受字符指针
- 字符指针数组内存分配
- 字符指针不递增?
- 如何在C++中使用字符指针
- 确保字符指针始终指向相同的字符串文字
- C++中的字符指针
- 使用unique_ptr的常量字符指针
- 字符指针不断意外更改
- 将字符指针中的十六进制转换为十进制
- 如何将字符*(字符指针)转换为 PCSZ?
- 在向量中存储字符指针
- 字符指针具有不同的值