2016-12-20 3 views
1

にヌルターミネータを入れてください、私はC文字列がブレース囲まれたリストを使用して初期化されるとき、多くの書籍やオンラインチュートリアルでは、それは次のように行われていることに気づいた:はなぜ我々はブレース囲まれたchar配列の初期化

char string[100] = {'t', 'e', 's', 't', '\0' }; 

Shouldn」すべての未指定の値は自動的に0(別名'\0')に設定されますか?

GCCとMSVCの複数のバージョンでこれをテストしましたが、実際にはすべての値がゼロに設定されていますが、初期化時にヌルターミネータを明示的に記述する特別な理由があるのでしょうか。

+0

私は古いバージョンのC標準では余分な要素をゼロにする必要があるとは言いませんでした。 – Barmar

+0

ヒント: 'char string [] = {'t'、 'e'、 's'、 't'};'と書くとどうなりますか?これはprintf()に渡すと良いでしょうか? – Jens

+1

@Jens配列のサイズが指定されていないため、これとは異なります。 – Barmar

答えて

4

あなたは右(brace-から」初期化を参照してくださいしています同封リスト "here)。しかし、これはまた、苦情なしでコンパイルなるので、良い習慣です:

char string[4] = {'t', 'e', 's', 't'}; 

をしかし、あなたは文字列としてそれを使用する時はいつでもエラーにつながる何かを、NULLで終了しないでしょう。あなたは

char string[4] = {'t', 'e', 's', 't', '\0'}; 

を言うなら、コンパイラは'\0'が収まらないので、それは誤りであることを知っているだろう。それは同じ理由であっても

char string[100] = "test"; 

に優れていることだ

注:

char string[4] = "test"; 

が第二、最初の例と同じではありませんを行います!

1

文字配列のサイズを明示的に指定し、文字列のペイロード部分に必要な文字数より多くの文字を割り当てる場合は、ヌルターミネータを追加する必要はありません。この状況では、残りの文字をゼロで初期化する必要があります。

あなたはヌルで終わる配列のサイズは、コンパイラによって自動的に決定させたいときに必要なだけの時間がある、すなわち

char string[] = {'t', 'e', 's', 't', '\0' }; 
//   ^^ 
2

愚かな間違いを防ぐことです。文字が文字列として解釈される場合は、最初のヌル文字が必要です。

char string[4] = {'t', 'e', 's', 't'}; 

はうれしくコンパイルされますが、NULLで終了しません。

char string[4] = {'t', 'e', 's', 't', '\0'}; 

は、ポイントがコンパイルに失敗します。

null文字を明示的に指定することによって、コンパイラは配列が意図した目的に十分に大きいことを確認します。

関連する問題