2017-02-23 18 views
-4

cstdargは、C++で可変数の引数を持つために使用できます。cstdargを使用しても安全ですか?

ステップバイステップで行ってください。関数が呼び出された後、引数は順番にスタックにプッシュされます。

私は、引数が大きくなりすぎると、stackoverflowsが発生し、PCがクラッシュします。

これは間違いありませんか?そうであれば誰でもcstdargを使用することは危険ではないでしょうか?

+1

そのロジックによって、有効なオブジェクトを指していない可能性があるためポインタを使用することは危険です。 –

+2

cstdarg.hとは?あなたは ''を意味しますか? –

+3

_ "もし私が引数を増やすとstackoverflowsが大きくなり、PCがクラッシュしたら、これは正しいのでしょうか?そうだとすれば誰でもcstdargを使用するのは危険ですか?" _これは完全な非連続です。どうやってその結論に来たのですか?同様に、あなたが6999999 MPHで運転すると、あなたは墜落し、人々は死ぬでしょう。すべての車を「誰にでも使用するのが安全でない」ものにしていますか?いいえ。 –

答えて

0

実際のC++コンパイラは、実際の物理的な制限や自然の法則によって制約を受けます。 C++標準では、附属書Bの "Implementation Limits"を指定し、実際の制限を文書化する実装を必要とすることで対応しています。この規格では、このような制限ごとに最小値を推奨しています。

あなたが探している制限はおそらく "1つの関数呼び出しの引数"ですが、その推奨最小限の制限はC++では256です。実際の制限については、コンパイラーの資料を参照してください。

個人用プラットフォームの上限まで可変引数を使用することは安全です。標準の推奨制限値内に収まる移植性のあるコードを発送することは妥当です。コンパイラが推奨された最小値を保つことができないユーザは、おそらくその事実に気づいていて、慎重に注意しなければならないでしょう。

+0

お返事ありがとうございました。 Kerrek SB –

+0

これは必ずしも256引数を渡すことが安全であることを意味するものではありません。通常、コンパイラは固定の制限を課さない。可変限度は利用可能なメモリに依存する可能性があります。あるケースでは256個の引数を渡すことができますが、別のケースでは、他のものによって消費されたり、引数が大きいために十分なメモリがない可能性があります。 –

+0

@KeithThompson:そうです。ある意味では、コールスタックの最後にいる可能性があるため、完全なコンテキストを持たない場合でも、いつでも任意の関数を呼び出すことができるかどうかはわかりません。 –

関連する問題