0

これがスニペットです

main(){
//
  while(){
  int b;
  scanf("%d",&b);
  int arr[b];
  }
}

さて、配列の正確な境界がわからないので、scanf * を使用して変数 * として取り込む必要があります。そして、作成された配列にはガベージ値が含まれています。そのためには、各要素を 0 に初期化する必要があります。これが必要だからです。

ループ内で毎回初期化する必要なく、これを機能させる方法はありますか?

ありがとう

編集 calloc を使用してメモリを割り当てることができると思います。使用されるメモリに違いはありますか?

4

2 に答える 2

4

実行時のサイズの配列が必要な場合、適切なアプローチは、配列の大きさによって異なります。

の値bが大きくなる可能性がある場合、それをローカル配列として宣言すると、スタック オーバーフローが発生する可能性があります。その場合、 を使用して配列を動的に割り当てることをお勧めしますcalloc。配列callocを適切にゼロ初期化します。int

配列が比較的小さく、安全にスタックに割り当てることができる場合は、単純にそれをローカル配列として宣言し (これは元のコードで行ったことです)、 を使用してすべてゼロに設定できますmemset(arr, 0, sizeof arr)

もちろん、どちらの場合も、ライブラリ関数内に実装された隠れたメモリゼロ化サイクルが発生する可能性があります。一般に、サイクルを使用せずにメモリの大きな領域をゼロに設定することはできません。

于 2013-07-14T08:20:44.380 に答える
1

コンパイラが C99 をサポートしている場合は、VLA を簡単に使用できます。

int a, b; 
printf("Enter size of array: ");
scanf("%d",&b);

int arr[b];

あなたの場合、すべての要素をゼロに初期化するには、内部ループまたは標準ライブラリ関数を使用しますmemset

memset(b, 0, sizeof(b));
于 2013-07-14T08:23:34.183 に答える