2017-08-05 112 views
-4

为什么我能够更改指针p中的元素,但不是指针r中的元素?我猜它必须做指针的属性。指向字符串的指针无法更改字符

p[2]更改为w使Gowdbye。更改r崩溃代码。

p的地址是0x69fee0

r的地址是0x69fedc

两者在for循环中都有相同的输出(除了'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; 
} 

回答

8

所不同的是q是其与一个字符串"Goodbye"的“复制”初始化的(可变的)阵列,而r是一个指针(不可变)字符串文字本身。更改字符串文字是未定义的行为(因此可能会崩溃或执行其他操作)。

0

原因此故障是*之间的区别[]: -

实际的区别是,当我们宣布* R =“再见” 编译器将挂机在 内存只读部分并返回一个指针,该 将被放置在字符指针和任何写操作 该位置将引起分段故障

但q []将分配存储器位置中的字符 然后字符复制到该位置和位置 是writeab所以任何修改都是有效的。

+0

不能保证字符串文字将被放置在“只读存储器”中。 C++标准只是说试图修改一个字符串会导致未定义的行为。 –