0

次のコードでは、なぜこの間接参照を実行できないのですか*arr = 'e'。出力は文字ではありません'e'か?

int main ()
{
    char *arr = "abt";
    arr++;
    * arr='e'; // This is where I guess the problem is occurring.
    cout << arr[0];

    system("pause");

}

次のエラーが発生します。

Arrays.exeの0x00a91da1で未処理の例外:0xC0000005:アクセス違反の書き込み場所0x00a97839。

4

2 に答える 2

3

"abt"は文字列リテラル定数と呼ばれるものであり、これを変更しようとすると、未定義の動作が発生します*arr='e';

于 2012-07-01T23:12:00.860 に答える
0
int main ()
{
    char *arr= "abt"; // This could be OK on some compilers ... and give an access violation on others
    arr++;
    *arr='e'; // This is where I guess the problem is occurring.
    cout<<arr[0];

    system("pause");

}

対照的に:

int main ()
{
    char arr[80]= "abt"; // This will work
    char *p = arr;
    p++;    // Increments to 2nd element of "arr"
    *(++p)='c'; // now spells "abc"
    cout << "arr=" << arr << ",p=" << p << "\n"; // OUTPUT: arr=abc,p=c
return 0;    
}

このリンクと図は「理由」を説明しています。

http://www.geeksforgeeks.org/archives/14268

Cプログラムのメモリレイアウト

Cプログラムの典型的なメモリ表現は、次のセクションで構成されています。

  1. テキストセグメント
  2. 初期化されたデータセグメント
  3. 初期化されていないデータセグメント
  4. スタック
  5. ヒープ

また、const char * string = "hello world"のようなCステートメントは、文字列リテラル "hello world"を初期化された読み取り専用領域に格納し、文字ポインター変数文字列を初期化された読み取り/書き込み領域に格納します。

于 2012-07-01T23:23:33.580 に答える