0

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

次の 2 つのコードを実行しようとしましたが、file2.c でセグメンテーション エラーが発生し ますが、 file1.cではエラーは発生しません。誰かが次のコードの違いを説明できますか:

file1.c

#include <stdio.h>

int main()
{
    int i;
    char  string[11] = {"HelloThere"};
    string[10] = '\0';
    for(i =0;i<5;i++)
    {
        string[i] = 'a';
    }
    printf("%s\n",string);
}

と :

file2.c

#include <stdio.h>

int main()
{
    int i;
    char * string;
    string = "HelloThere";

    for(i =0;i<5;i++)
    {
        string[i] = 'a';    
    }
    printf("%s",string);

}
4

2 に答える 2

3

これは、割り当て

char  string[11] = {"HelloThere"};

文字列定数を書き込み可能なメモリにコピーします。

char * string = "HelloThere";

読み取り専用メモリに残します。書き込み可能なメモリへの書き込みは絶対に問題ありませんが (当然です!)、読み取り専用メモリへの書き込みは未定義の動作であり、クラッシュを引き起こす可能性があります。

文字列リテラルに必要な以上のメモリを割り当てたい場合を除き、文字列のサイズを明示的に指定する必要はないことに注意してください。

char  string[] = {"HelloThere"}; // <<== The size is empty
于 2013-01-05T17:58:09.887 に答える
1
string = "HelloThere";

それから

string[i] = 'a';

は間違っています - 文字列リテラルを変更しようとしていますが、変更できません。これにより未定義の動作が発生するため、クラッシュを含むあらゆることが発生する可能性があります。

でも、

char sring[11] = "HelloThere";

自動配列を作成し(事前に文字列の内容をコピーします)、書き込み可能で、要素を変更できます。

于 2013-01-05T18:00:09.327 に答える