-1

これは私の簡単なプログラムです:

int main(int argc, const char * argv[])
{
    char s [5] = "Hello";
    printf("%s", s);
    return 0;
}

Helloは 5 文字の長さなので、定義しますchar s [5]が、出力は次のとおりです。

こんにちは\370\277_\377

を に変更するchar s [5]char s []、すべて正常に動作します。私のコードの問題は何ですか?

4

1 に答える 1

16

nullターミネータを忘れています。

C 文字列は\0、文字列の終わりを示すために、末尾に 1 バイトが必要です。出力が奇妙に見える理由はprintf、ヌル ターミネータを探している が初期化されていないメモリに迷い込み、未定義の動作を引き起こすためです。

この場合、printf幸運なことに null をすぐに見つけて、ガベージを出力した後に正常に終了するように見えます。ただし、この種のバグにより、多くの場合、メッセージが表示されてプログラムがクラッシュしますsegmentation fault。「セグ フォールト」は、オペレーティング システムがプロセスを強制終了したときに発生します。これは、プロセスに属していないメモリを読み取るなど、想定外のことを実行しているために発生します。

代わりにこれを試してください:

char s[] = "Hello"; //s is now 6 characters long.

数値を指定しないことで、コンパイラは必要な配列の大きさを決定し、"Hello"データをそこにコピーします。

変更したくない文字列が必要な場合は、代わりに次のように宣言する必要があります。

const char* s = "Hello";

このようにして、文字列を含む静的メモリを指すポインターを作成しました"Hello"。コピーは必要ありません。

于 2013-05-10T19:13:18.100 に答える