0

重複の可能性:
なぜこの Seg Fault が発生するのですか?

char * で ++ 演算子を使用すると、セグメンテーション違反が発生します

#include<stdio.h>

int main()
{
    char *s = "hello";
    printf("%c ", ++(*s));
    return 0;
}

しかし、私が次のことを行うと:

#include<stdio.h>

int main()
{
    char *s = "hello";
    char c = *s;
    printf("%c ", ++c);
    return 0;
}

次に、コードは完全にコンパイルされます。上記のコードの問題は何ですか?

4

6 に答える 6

5

最初のコード スニペットは、文字列リテラル内の文字を次のように変更しようとしています。

++(*s)

の最初の文字をインクリメントしようとしていますs。文字列リテラルは (一般的に) 読み取り専用であり、変更しようとするとセグメンテーション違反が発生します (C 標準では、プログラムがそのような配列を変更しようとすると、動作は未定義であると述べられています)。

2 番目のスニペットは、次のcharように読み取り専用ではない変数を変更しています。

char c = *s;

cの最初の文字のコピーsであり、c安全にインクリメントできます。

于 2012-08-10T07:43:22.790 に答える
2

最初のケースでは定数リテラルを変更し、2 番目のケースでは変数を変更します。

于 2012-08-10T07:42:46.853 に答える
2

このコード:

printf("%c ", ++(*s));

文字の 1 つへのポインターを介して文字列リテラルを変更しようとします。文字列リテラルの変更は未定義の動作です。結果として、文字列リテラルは読み取り専用メモリに保存されることが多いため、変更することは技術的に違法であり、システムでセグメンテーション違反として現れるのはそのためです。

于 2012-08-10T07:43:14.970 に答える
1

char * s = "hello";

これは、「s」がconst文字列であることを意味します。

非const文字列が必要な場合は、ヒープから明示的に割り当てる必要があります。

于 2012-08-10T07:44:44.460 に答える
1

許可されていない最初のケースで文字列リテラルを変更しようとしています。2番目のケースでは、文字列リテラルの最初の文字から新しい文字を作成します。その文字のコピーを変更すると、2番目のケースが機能します。

于 2012-08-10T07:44:51.290 に答える
0

コードには、文字列リテラルが格納されているセグメントに対する書き込み権限がありません。

于 2012-08-10T07:45:00.400 に答える