2

文字列を反転する関数を作成しようとしていますが、実行中に次のような例外が発生しました: *str++ = *end; 何が理由か分かる人いますか?前もって感謝します。

void reverse(char* str)
 {
    char *end = str;
    char temp;
    if(str)
    {
      while(*end)
       {
     end++;
       }
    end--;

    while(str<end)
    {
       temp = *str;
       *str++ = *end;
       *end--=temp;
    }
   }
 }
4

2 に答える 2

5

おそらく、文字列リテラルを使用して関数を呼び出した可能性があります。

 reverse("ablewasiereisawelba");

未定義の動作を呼び出さずに文字列リテラルを変更することはできません。クラッシュは、文字列リテラルを変更しようとする試みに対する有効な応答です。代わりに、定数でない配列を渡すようにしてください。

 char palindrome[] = "ablewasiereisawelba";
 reverse(palindrome);

C++ 2011 標準、ISO/IEC 14882:2011 は次のように述べています。

2.14.5 文字列リテラル [lex.string]

¶12 文字列リテラルを変更しようとした場合の影響は未定義です。

通常、文字列リテラルは読み取り専用メモリに配置され、それを変更しようとすると「クラッシュ」が発生します。これは、未定義の動作を呼び出すことに対する完全に正当な応答です。

于 2013-02-02T17:33:23.220 に答える
0

したがって、これを行う必要があります。

 char str[] = "My string to reverse!";

 reverse(str);

これはstr、変更可能なメモリに保存されることを意味します。最新のコンパイラのほとんどは、リテラル文字列を格納します(つまり、元の文字列を変更することを意図していないため、「引用符内のすべて」を読み取り専用メモリに格納します)。

于 2013-02-02T17:40:23.317 に答える