1

私はCの初心者です....少しコードがあります:

#include <stdio.h>
#include <string.h>

int main(){
   char str1[100];
   char str2[100];
   char str3[100];
   char str4[100];

   puts(str1)
   puts(str2);
   puts(str3);
   puts(str4);

   return 0; 
}

結果出ました

2
èý(
‘Q]wØ„ÃîþÿÿÿÀ"bwd&bw

配列が最初から空にならない理由がわかりません。そして、配列の内容をクリアするには、最初の要素を「\ 0」に設定する必要があります。誰か説明してくれませんか。どうもありがとうございます。

4

4 に答える 4

11

C では、ローカル変数に値を割り当てないと、ローカル変数は自動的に初期化されません。ここでは、配列は初期化されていません。つまり、作成後にガベージが含まれている可能性があります。

はい、次のように明示的に「空」に設定する必要があります。

char str[100];
str[0] = '\0';
// Now you have an empty string of zero length.
assert(strlen(str) == 0);
// But the size is still 100.
printf ("%d", sizeof(str));

または、初期化中に空の文字列 (文字配列) を作成できます。上の例と同じサイズと長さです。

char str[100] = "";
于 2013-09-01T04:36:22.607 に答える
7

文字列を自動的にゼロにしない理由については、そうするとコストがかかるためです.Cは通常、明示的に指示しない限りコストのかかることは行いません。少なくとも、すべての配列の最初の要素をゼロに設定する必要があり、このように配列を初期化したくない、または初期化する必要がない場合がたくさんあります。C が常にこれを行っていた場合、取り除くことができない無駄なオーバーヘッドが常に発生します。

原則として、C はバックグラウンドで明示的に指示しない限り何も実行しないため、配列を要求すると配列が返されるだけで、指示がない限り内容には触れません。それをする。プログラマーの作業が少し増える可能性がありますが、コンピューターの動作をより細かく制御できるという利点があります。

とにかく常に変数を初期化し、この種の小さなコストを忘れることは良いプログラミングの実践であると考える人もいます.レベルの言語であり、このようなことを強制するものではありません。

于 2013-09-01T04:46:32.260 に答える
0

配列が「空」で始まらなくても問題ないと思います。C では、変数はランダムな値で始まります。Java とは異なり、変数を宣言すると、JVM はデフォルトでそれを開始します。

于 2013-09-01T04:39:09.480 に答える