6


0

なぜ私のために働いていないのですか?
char p[4]={'h','g','y'};
cout<

このコードは3を出力します。

char p[3]={'h','g','y'};
cout<

これは8を印刷します。

char p[]={'h','g','y'};
cout<

これも8を印刷します。

配列のサイズを変更しても3つの異なる値が出力される理由がわからないので、助けてください。

7 Answer


27


http://en.cppreference.com/w/cpp/string/byte/strlen [strlen]は、指定されたポインターから開始し、文字「 '\ 0'」に達するまで進みます。 配列に ’\ 0'`がない場合は、’ \ 0'`に到達するまでの_any_番号になります。

探している番号に到達する別の方法(示した場合)は、 `int length = sizeof(p)/ sizeof(* p);`を使用することです。これにより、配列の長さがわかります。 。 ただし、これは厳密には `strlen`で定義された文字列の長さではありません。

@John Diblingが述べているように、 strlen`が最初の例で正しい結果を与える理由は、4文字のスペースを割り当てたが、3文字しか使用しなかったためです。残りの1文字は自動的に0に初期化されます。これは、 `strlen`が探す '\ 0'`文字です。


4


最初の例だけがヌルで終了する文字の配列を持っています-他の2つの例はヌルで終了していないので、明確に定義された方法でそれらに `strlen()`を使用することはできません。

char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'

char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator

char p[]={'h','g','y'};  // p[] implicitly sized to 3 - also no room for '\0'

最後のケースでは、文字列リテラルを使用して配列を初期化すると、ヌルターミネータが取得されることに注意してください。

char p[]= "hgy";  // p[] has 4 elements, last one is '\0'


1


それはあなたに乱数を取得します。 strlen`が機能するには、文字列が '\ 0’で終了している必要があります。


1


これを試して:

char p[4]={'h','g','y', '\0'};


1


`strlen`は_strings_(Cの用語の意味)で機能する標準ライブラリ関数です。 _String_は、「\ 0」値で終わる「char」値の配列として定義されます。 `strlen`に_string_ではない何かを指定した場合、動作は未定義です。コードがクラッシュしたり、コードが意味のない結果を生成したりする可能性があります。

あなたの例では、最初のものだけが_string_で `strlen`を提供しているので、期待通りに動作します。 2番目と3番目のケースでは、指定するのは文字列ではなく( `\ 0`で終了しない)、結果が予想通り意味をなさない理由です。


0


’\ 0'`は文字バッファを終了します。

char p[4]={'h','g','y', '\0'};


0


これは、strlen()が文字列のヌルターミネータを見つけることを期待しているためです。 この場合、あなたはそれを持っていないので、strlen()は\ 0を見つけるかメモリアクセス違反を与えてプログラムが死ぬまでカウントし続けます。 RIP!