0

重複の可能性:
文字列への書き込み時にセグメンテーション違反が発生するのはなぜですか?

次の単純な関数は、文字配列をその場で逆にする必要があります。

void reverse(char* str)
{
    char* last = str;

    // find end of the string
    while(*last) {
        ++last;
    }

    // swap characters until the pointers meet in the middle
    while(str < last)
    {
        --last; 
        char temp = *str;
        *str = *last;
        *last = temp;
        ++str;
    }
}

int main()
{
    char* a= "Hello";
    reverse(a);
    return 0;
}

コードがコンパイルされます。ただし、アクセス違反に関する実行時エラーがスローされます。デバッガーによると、犯人は次の行です。

char temp = *str;

なぜそれが起こるのですか?

4

1 に答える 1

6
char* a= "Hello";

ポインタaは文字列リテラルを指しています。標準によれば、文字列リテラルを変更しようとすると、未定義の動作が発生します。実装の場合、セグメンテーションフォールトは、コンパイラが文字列リテラルを変更不可能なメモリに配置することを選択していることを示します。

a変更可能な文字列であることを宣言します。たとえば、次のようになります。

char a[] = "Hello";
于 2012-12-12T21:48:31.800 に答える