私がこれをしたら
int wsIdx[長さ];
私はsegFaultを持っています
しかし、私がこれを行うと
int *wsIdx;
wsIdx = (int *)malloc(sizeof(int) * length );
大丈夫。
この問題は、テスト中に長さが 2560000 と高い場合にのみ発生します。私は広く十分な記憶を持っています。2 つの割り当て方法の違いと、最初の割り当て方法が機能しない理由を説明していただけますか? ありがとうございました。
最初のものは「スタック」(通常はローカル変数に使用される領域)に割り当てられ、2番目のものは動的に割り当てられたメモリの領域である「ヒープ」に割り当てられます。
最初の方法で割り当てるのに十分なスタック領域がありません。ヒープが大きいです。
この SO の議論は役に立つかもしれません:スタックとヒープとは何ですか? .
メモリを動的に割り当てる場合、malloc/calloc/etc の戻り値を調べることで、割り当ての成功または失敗をいつでも確認できます。残念ながら、スタックにメモリを割り当てるためのそのようなメカニズムは存在しません。
length
が定数ではないと仮定すると、最初の形式は可変長配列(VLA) であり、最大の問題の 1 つに遭遇したことになります。
malloc
ベスト プラクティスは、次の 2 つの理由から、「大きな」配列の VLA を避け、代わりに使用することです。
クラッシュするか、その他の未定義の動作を引き起こす以外に、割り当ての失敗を報告するメカニズムはありません。
通常、VLA はスタックに割り当てられますが、スタックのサイズは比較的制限されています。そのため、割り当てに失敗する可能性がはるかに高くなります!
暗示auto
的に有害と見なされる
すでに与えられた答えに同意するために、障害のあるコードが明示的なストレージクラスで記述されていた場合、この一般的な問題はより明白になる可能性があります。
void
not_enough_stack(void)
{
auto int on_stack[2560 * 1000];
printf("sizeof(stack) %d\n", sizeof(on_stack));
}