0

どうやらCは宣言が好きではありません:

char some_array[n] = "Text here"; <==ここで、nは適切なサイズのintです。

まあ、実際には、それはうまくいくと思いますが、出力は私を驚かせます!これが例です。

    char two[4] = "What";
    printf("2: %s \n", two);

出力は次のとおりです。

2: WhatWhat 

一体何が何なのか?

だから私は追加してみます:

    char test[4] = "abcd";

出力は次のとおりです。

2: WhatWhatabcd
3: abcd

ええ、わかりました。私の構文は好まれません。しかし、なぜ?!そして、実際の変数はどうなっているのでしょうか。

4

4 に答える 4

3

文字列リテラルには、ヌル文字という余分な文字があります。

したがって、長さ5にする必要があります。

char two[5] = "What";

または、可能であればこれ:

char two[] = "What";

(バッファオーバーランなどが発生しています)

于 2013-03-01T05:18:21.477 に答える
1

文字列を扱うときは、ヌル ターミネータを考慮する必要があります。ここでは、4 文字の文字列リテラルを 4 文字の配列に割り当てようとしています。これにより、null ターミネータに余分な文字スペースが提供されません。

以下のようにコードを変更します。

char two[5] = "What";
char test[4] = "abcd";

なぜ"What"あなたが問題を抱えていて、それを持っていないのかについては、プログラムはヌルターミネータが見つかるまでメモリを検索しようとするため、そのような場合"abcd"動作は未定義です。あなたの場合、それは正しく印刷されていません。クラッシュ、ハング、または神が何を知っているかを引き起こす可能性があります。

于 2013-03-01T05:20:51.990 に答える
1

あなたの場合、文字列は NULL 文字だけで終了します。これは、4 バイトのスペースを割り当て、その中に「何」を正確に 4 文字格納しているため、NULL 終了のためのスペースが残っていないためです。

printfの印刷中に、言及した開始アドレスからデータの読み取りが開始され、NULL文字まで続きます...したがって、バッファが割り当てられている隣接メモリにジャンク文字が含まれている可能性があります(メモリは常に自動的にフラッシュされないため) 、バッファが解放されたとき) したがって、whatwhat が表示されているか、それが whatjkefwhksdjfsdfjsf である可能性があります... または、許可されていないメモリの場所まで読み取る場合は、セグメンテーション違反の可能性があります。

于 2013-03-01T05:21:29.043 に答える
1

最大配列インデックスが 4 であるため、この問題に直面しています。

char test[5] のように最大配列インデックスを 5 にして、文字列を NULL で終了できるようにします。あなたの問題はソートされます。

于 2013-03-01T05:23:41.750 に答える