指向字符串的指针无法更改字符

Pointer to String Fails to Change Character

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

为什么我可以更改指针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[] 将为字符分配内存位置 然后将字符复制到该位置和位置 是可写的,因此任何修改都是有效的。