2009-03-16 8 views
11

私は単純なプログラムを持っており、アクセス違反は*(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

いいえ、そうしないでください。 "Hello world"は定数の文字列リテラルで、自由に変更できるメモリが必要な場合は、Cでmalloc()、またはC++でnewを使用してメモリを割り当てる必要があります。

2

あなたはメモリの保護領域であってもよく、文字列リテラルのストレージへの書き込みをしているためです。

25

char *str = "Hello World";はconstの文字列で、変更することはできません。コンパイラは書き込めない場所に自由に置くことができ、クラッシュすることがあります。

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

+0

あなたの提案が現在のコードと同じになります。 –

+0

char str []とchar * strの結果、文字列が変更可能になります。 – Michael

+0

ここにいくつかの参照があります: http://www.iso-9899.info/wiki/StringsByExample https://www.securecoding.cert.org/confluence/display/cplusplus/STR30-CPP.+Do + not +試み+ + +文字列+リテラルを変更する – Michael

3

他の人が指摘したように、リテラル文字列は、メモリの読み出し専用領域に記憶されてもよいです。警告をオンにしてコンパイルしていますか?文字列リテラルの定数を破棄することについての警告を受けるべきです。あなたの代わりに何ができるか

は次のとおりです。

char *str = strdup("Hello, world!"); 
// Modify the string however you want 
free(str); 
関連する問題