0

私のコードは次のようなものです:

int main(int argc, char *argv[])
{
    char ca[] = {'0'};
    cout << *ca << endl;
    cout << *(ca+1) << endl;
    cout << ca[1] << endl;
    cout << (char)(0) << endl;
    return 0;
}

結果は次のようになります。

 0
 \210
 \210
 ^@

このスレッドから、それは実際^@と同じであることがわかりました。\0ただし、結果を表示する\210ために使用するためではないようhexdumpです。

 bash-3.2$ ./playground | hexdump -C
 00000000  30 0a 88 0a 88 0a 00 0a                           |0.......|
 00000008

の代わりにあること\210がはっきりとわかります。8800

私が理解したように、ca+1はを指す必要null terminatorがあり\0ます。しかし、なぜ結果としてcout << *(ca+1) << endl;\210を与えるのですか?

4

2 に答える 2

4

文字配列を宣言するときにnullターミネータを手動で追加する必要があるためです。文字列(のように)にするchar myString[] = "hi"と、ヌルターミネータが追加されます。しかし、中かっこを使用して配列にすると、そうではありません。

0x88バイトに関しては、なんらかの理由でRAMの次のバイトになりました。

于 2013-02-10T08:10:32.973 に答える
2

有効なCプログラムでは、文字列リテラルは常にnullで終了します。ここでは、文字配列の個々の要素を初期化しようとしていますが、文字列リテラルではなく、リスト初期化構文のみを使用しています。これは同じ関数で割り当てられた静的配列であるため、sizeof演算子を使用してこれを確認することもできます。実行caすると、1、つまり1つの文字配列が得られます。ただし、次のようなことをした場合char ca[] = "0";、適用するsizeof(ca)と2、つまり文字「0」とnull終了文字が得られます。aaaaaa123456789が述べたように、これは現在取得している単なる出力であり、メモリ内のもう1バイトです。これを別の時間に実行すると、別の出力が表示されたり、プログラムがクラッシュしたりする可能性があります。間違った場所を参照すると、実行時の異常が発生する可能性があります。

于 2013-02-10T09:28:08.457 に答える