2

C++ で、コンパイラが次の文字ポインタを次のように変更できない理由

#include <iostream>

int main()
{
char* cp = "overflow";
cp[1]='p';
return 0;
}

出力 : 実行時にクラッシュします。

ただし、文字配列は許可されますが、

#include <iostream>

int main()
{
char cps[] = "overflow";
cp[1]='p'; // this compiles fine and output is operflow
return 0;
}

実行時に何が起こっているのか、なぜクラッシュしているのかを知りたいだけです。ありがとうございました。

4

4 に答える 4

9
于 2013-04-10T11:35:46.410 に答える
2

This:char* str="";は文字列リテラルであり、メモリの読み取り専用セクションに格納される可能性があるため、クラッシュする可能性があります。使用const char* const str="string";(ポインターとデータの両方が定数である、または少なくともデータが定数である必要があります:const char* str="string";またはchar const* str="string";)

文字列リテラルの内容を変更しようとすると、未定義の動作となり、セグメンテーション違反が発生してクラッシュする可能性があります。

于 2013-04-10T11:35:55.087 に答える
0

設定char* cp = "overflow";すると、(その後にNULL終端バイトが続く)メモリの読み取り専用ブロックが作成"overflow"されるため、そこに書き込むことはできません。変更しようとするc[x]と、そこに書き込む必要があります。

コードの 2 番目のブロックについては、何かが不足しているため、質問の一部が不明確です。

于 2013-04-10T11:36:32.053 に答える
0

文字へのポインターはarrayおよび ではないためlow-level constです。あなたができる

char cp[] = {'o', 'v', 'e', 'r', 'f', 'l', 'o', 'w', '\0'};

char *pcp = cp;

*++pcp = 'p';

ただし、"overflow"は変更できない文字の定数シーケンスです。したがって、ポインター演算を実行し、値のポインターを逆参照することしかできません。

char *cp = "overflow";

std::cout << *++cp std::endl;
于 2013-04-10T12:09:13.983 に答える