12

簡単なプログラムがあり、でアクセス違反が発生し*(str + start)ます。なんで?私はそれを変えることができるはずです。右?

void fn()
{
     char *str = "Hello wordl!";
     int end = strlen(str);
     int start = 0;
     end--;
     while(start < end)
     {
         *(str + start) = *(str + end);  <--- Access violation writing location *(str + Start).
         end--;
         start++;
     }
}
4

5 に答える 5

28

char *str = "Hello World";const 文字列であり、変更できません。コンパイラは書き込み不可の場所に自由に配置できるため、表示されるクラッシュが発生します。

宣言を に置き換えるとchar str[] = "Hello World";、文字列がスタック上の変更可能な配列に配置され、必要なことが行われます。

于 2009-03-16T21:18:56.597 に答える
4

いいえ、すべきではありません。「Helloworld」は定数文字列リテラルです。Cではmalloc()を使用してメモリを割り当てる必要があります。メモリを自由に変更できる場合は、C++ではnewを使用する必要があります。

于 2009-03-16T21:10:53.700 に答える
3

他の人が指摘したように、リテラル文字列はメモリの読み取り専用領域に格納される場合があります。警告をオンにしてコンパイルしていますか? 文字列リテラルの constness を破棄することに関する警告が表示されるはずです。

代わりにできることは次のとおりです。

char *str = strdup("Hello, world!");
// Modify the string however you want
free(str);
于 2009-03-17T01:59:19.433 に答える
2

これは、メモリの保護された領域にある可能性のある文字列リテラルのストレージに書き込んでいるためです。

于 2009-03-16T21:11:53.090 に答える