2017-08-05 10 views
-4

ポインタpでは要素を変更できますが、ポインタrでは要素を変更できないのはなぜですか?私はそれがポインターのプロパティで行う必要があります推測しています。文字列へのポインタが文字の変更に失敗する

p[2]からwに変更するとGowdbyeになります。 rを変更すると、コードがクラッシュします。

pのアドレスは0x69fee0です。

rのアドレスは0x69fedcです。

両方とも、 'Goodbye'という単語が終わった後のガベージデータ以外に、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; 
} 

答えて

8

差がrは、(不変の)文字列リテラル自体へのポインタであるのに対しqは、"Goodbye"リテラル文字列の「コピー」で初期化される(可変)アレイであることです。文字列リテラルを変更すると、未定義の動作になります(クラッシュするなど)。

0

この障害の理由は、*との違いは、[]: -

実際の違いは、私たちは宣言時* R =「さようなら」 メモリの読出し専用部分にさよならを配置します コンパイラセグメンテーション違反を引き起こすであろう がcharポインタ、任意の書き込み動作 内に配置されている場所へのポインタを返す

が、Q []は文字のメモリ位置を割り当てること その場所に文字をコピーしてロケーション は、どんな変更も有効です。

+0

文字列リテラルは、「読み取り専用メモリ」に置かれる保証はありません。 C++標準では、文字列リテラルを変更しようとすると、定義されていない動作が発生することがわかります。 –

関連する問題