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

时间:2017-08-05 22:50:33

标签: c++ arrays string pointers char

为什么我能够更改指针p中的元素,而不是指针r中的元素?我猜它必须使用指针的属性。

p[2]更改为w会让Gowdbye感到高兴。更改r会导致代码崩溃。

p的地址为0x69fee0

r的地址为0x69fedc

两者在for循环中都有相同的输出(除了#39; Goodbye'之后的垃圾数据)。

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;
}

2 个答案:

答案 0 :(得分:8)

不同之处在于q是一个(可变)数组,用&#34; copy&#34;初始化。字符串文字"Goodbye",而r是指向(不可变)字符串文字本身的指针。更改字符串文字是未定义的行为(因此可能会崩溃或执行其他操作)。

答案 1 :(得分:0)

此错误的原因是*和[]之间的差异: -

实际差异是当我们宣布* r =“再见”时 编译器会将Goodbye放在只读部分 内存并返回指向该位置的指针 将被放置在char指针和任何写操作中 将导致分段错误

但q []将为字符分配内存位置 然后将字符复制到该位置和位置 是可写的,所以任何修改都是有效的。