web-dev-qa-db-ja.com

アクセス違反の書き込み場所エラーを解決するにはどうすればよいですか?

単純なプログラムがあり、*(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++;
     }
}
11
I pra che

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

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

26
Michael

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

4
MattJ

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

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

char *str = strdup("Hello, world!");
// Modify the string however you want
free(str);
3
Dan Ellis

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

2

あなたの例では、Hello world!は定数文字列です。この定数文字列を変更しようとすると、例外が発生します。代わりに、これを行うことができます-

string s = "Hello wordl!";
char* ptr = &s[0];

その後、ptrで遊んでください。

0
A. Gupta