2

重複の可能性:
なぜこのセグメンテーション違反が発生するのですか?
char a [] =“ string”;の違いは何ですか。およびchar*p =“ string”;

s [0]='H'が失敗する理由を理解しようとしています。これはプロセスメモリのデータセグメントと関係があると思いますが、誰かがこれをよりよく説明しているのではないでしょうか。

void str2 (void) 
{ 
    char *s = "hello"; 
    printf("%s\n", s); 
    s[0] = 'H';          //maybe this is a problem because content in s is constant? 
    printf("%s\n", s); 
}

int main()
{
    str2();
    return 0;
}
4

3 に答える 3

6

C標準では、文字列リテラルを変更しようとすると未定義の動作が発生すると言われているため、これは誤りです。

正確に何が起こるかは変わる可能性があり、変わるでしょう。場合によっては、「機能」します。文字列リテラルの内容は、要求した内容に変更されます(たとえば、MS-DOSの時代には、通常は変更されていました)。その他の場合、コンパイラは同一の文字列リテラルをマージするため、次のようになります。

char *a = "1234";
char *b = "1234";

a[1] = 'a';

printf("%s\n", b);

1a34...明示的に変更したことがない場合でも、印刷さbれます。

さらに他の場合(ほとんどの最新のシステムを含む)では、試行された書き込みが完全に失敗し、代わりにある種の例外/シグナルがスローされることが予想されます。

于 2013-01-20T06:20:17.073 に答える
2

実装定義の読み取り専用メモリに存在する文字列リテラルを変更しようとしているため、未定義動作が発生します。未定義の動作は、プログラムがクラッシュすることを保証するものではありませんが、何らかの動作を示す可能性があることに注意してください。

良い読み物:
char a [] =?string ?;の違いは何ですか?およびchar*p =?string?;?

于 2013-01-20T06:20:10.123 に答える
0

これは定数への(char * s = "hello")ポインターであるため、この動作は適切または厳格なコンパイラでは許可されるべきではないと思います。つまり、コンパイラがエラーをスローしない場合、コンテンツを変更すると未定義の動作になります。

于 2013-01-20T06:57:46.867 に答える