1

重複の可能性:
文字列への書き込み時にセグメンテーション違反が発生するのはなぜですか?
char a[] = “string”; の違いは何ですか? および char *p = 「文字列」;

誰でも次のプログラムの問題を指摘できますか:

#include <stdio.h>

int main()
{
    char *c = "Hello World!! !!";
    char c2 = 'X';
    while(c)
    {
        if(*c == ' ')
        {
            printf("%s",c);
            *c = c2;
        }
        c++;
    }
    return 0;
}

*c = c2;次のエラーでクラッシュします:

Thread [1] (Suspended : Signal : EXC_BAD_ACCESS:Could not access memory)    
    main() at mainclass.cpp:64 0x100000d74  

MAC OSX のコンパイラとして GCC を使用し、IDE として Eclipse を使用しました。

4

2 に答える 2

3

コードではc、文字列リテラルを指します。行*c = c2は文字列リテラルを変更しようとしますが、これは未定義の動作です。未定義の動作の可能性のある兆候の 1 つは、文字列リテラルが読み取り専用メモリに置かれ、SIGSEGVまたは同様のものを取得することです。

次のようにコードを変更すると、動作するはずです。

char arr[] = "Hello World!! !!";
char* c = arr;

c配列を指すようになりました。文字列リテラルとは異なり、配列の内容を変更することは許可されています。

最後に、while ループは、ポインターが指す値ではなく、ポインターの値に誤って条件付けられています。null ターミネータ ('\0') を探しています。次のようになります。

while (*c)
{
    ...
    c++;
}
于 2012-11-29T09:10:41.037 に答える
2

char *c = "Hello World!! !!";実行する場合:cは、コード部分にあるメモリを指すポインタであるため、変更することはできません

しかし、もしあなたが持っているならchar c[] = "Hello World!! !!";cスタック上にあるcharの配列なので、それを変更することができます。

この場合は、char const *c = "Hello World!! !!";次のようにすることをお勧めします。そうすると、実行中に文字列を変更しようとしても、プログラムがクラッシュせず、コンパイラエラーが発生し、プログラムが実行されなくなります。これは、はるかに優れています。 。

于 2012-11-29T09:12:40.783 に答える