とは異なり、配列に十分なスペースがあるかどうかを確認するためのステートメントをmalloc
見たことがありません。if
では、スタックに割り当てられている場合でも、アレイは常に十分なスペースを確保できることが保証されていますか?それ以外の場合はどうすればよいですか?
5 に答える
保証は一切ありません。
スタック割り当てが成功したかどうかを確認する方法はありません。C規格では、制限(最小または最大)は義務付けられていません。
したがって、通常は固定サイズのスタックを割り当てるオペレーティングシステムに確認する必要があります。たとえば、私のUbuntuシステムでは、スタックサイズは1MB
です。したがって、オペレーティングシステムによって異なります。
実際、スタックサイズが十分かどうか疑問に思うようになった場合は、動的割り当て(malloc
)を使用する必要があります。
配列をどのように定義するかによって異なります。
例えば:
int foo[] = { 1, 2, 3 };
int bar[10] = { 1, 0 };
int fee[10];
上記の例では、配列foo
には割り当ての内容を含む3つのエントリが含まれます。一方、配列bar
には10個のエントリが含まれ、最初のエントリはゼロに初期化され1
、残りはゼロに初期化されます。配列fee
には10個のエントリも含まれますが、内容は初期化されておらず、ランダムに表示される可能性があります。
ただし、アレイの最後に割り当てられたメモリと同様malloc
に、アレイは上書きできます。たとえば、を行うことはできますがfoo[4] = 4;
、これにより配列外のメモリが上書きされ、クラッシュする可能性さえあります。
したがって、配列には、宣言した数のエントリ(または表示されるメモリ)が常に含まれ、foo
上記の例では、配列に割り当てるデータに対して正確に十分なスペースがあります。
通常、malloc
はスペースの割り当てを試みます。次に、if
条件を使用して、配列へのポインターが正常にmallocされたかどうかを確認できます。
if (ptr == NULL) {
printf("Error");
exit();
}
配列は常に有効または無効のいずれかで十分なスペースを取得します。つまり、スタックに十分なスペースがない場合は、他の目的に割り当てられた他のメモリを使用する可能性があります。そのような場合、あなたのプログラムは未定義の振る舞いにつながります(スタックオーバーフロー:))
これを可能にする標準には何もありません。ちなみに、これは配列だけに適用されるのではなく、すべてのC変数に適用されます。スタックがオーバーフローすると、プログラムがクラッシュします。死。たとえば、再帰を使いすぎると、この影響が生じる可能性があります。
複雑さを加えるために、コンパイル時にサイズが固定されている「クラシック」ANSI Cアレイ、または実行時にサイズを設定できるC99可変長アレイ(VLA)について質問していますか?
VLAは魅力的に見えますが、実行時チェックがないことは、あなたが示唆しているように、mallocよりも明らかに不利です。