7

nLinux では、C を使用して、配列に格納する必要がある要素の数を動的に決定したと仮定しint my_array[n]ます ( 100 バイト)。

ほとんどnは小さく、十分の一です。しかし、場合nによっては 1000 または 1'000'000 という大きなものになることもあります。

n*o + pスタックがオーバーフローせずにバイトを保持できるかどうかを計算するにはどうすればよいですか?

基本的に: スタックに残っているバイト数は?

4

2 に答える 2

4

スレッドを使用していない場合、またはコードがメイン スタックで実行されることがわかっている場合は、

  1. main に入るときに現在のスタック ポインターを記録する
  2. ルーチンで、現在のスタック制限を取得します ( を参照man getrlimit)
  3. 現在のスタック ポインターとステップ 1 で記録されたものとの差を、ステップ 2 の制限と比較します。

スレッドを使用していて、メイン以外のスレッドで実行している可能性がある場合は、を参照してください。man pthread_getattr_np

于 2011-12-03T17:05:15.783 に答える
4

確かに、利用可能なスタックの確認の質問は良い答えを与えます。

しかし、より現実的な答えは、コール スタックに大きなデータを割り当てないことです。

あなたの場合、ケースn<100(そして、おそらくallocaを介してスタックに割り当てるのが理にかなっている)とケース(その後、 (または)をn>=100使用してヒープに割り当て、それを忘れないでください)のケースを異なる方法で処理できます。しきい値 a -d を定数にします。malloccallocfree100#define

コール スタックの典型的なコール フレームは、現在のラップトップまたはデスクトップでは、せいぜい数キロバイトです (再帰またはスレッドがある場合は、できればそれ以下です)。合計スタックスペースは、通常、せいぜい数メガバイトです (時にはそれより少ないこともあります: カーネル内では、スタックは通常、それぞれ 4K バイトです!)。

于 2011-12-03T06:55:30.980 に答える