2

これら 2 つの形式の配列宣言は正しいですか?

初め:

int n;
n=3;
int A[n];

2番:

#define N 300;
.
.
.
.
int a[N];

私にとって2つの方法は完全に有効ですが、最初の方法が間違っていると誰かが言いました。

最初のものは次のように言っています。

int A[10];

したがって、私にとっては、最初のものが無効であると言うのはあまり意味がありません。

しかし、それについて完全に確信するために、私はここでそれを尋ねたかった. それは単にプログラミングスタイルに関するものですか、それとも最初のものはそれを行う正しい方法ではありませんか?

ありがとうございました。

4

3 に答える 3

1

どちらのバリアントにも長所と短所があります。


可変長配列の利点:

  • メモリを無駄にしません。必要なだけのメモリを簡単に割り当てることができます。これは文字列で最も顕著です。通常、ほとんどの文字列は非常に短いですが、非常に長い文字列を許可したいと考えています。すべての文字列に 0.5 キロバイトを割り当てることは、メモリを大量に浪費することになります。

  • 人為的な制限を導入しません。動的に必要なだけのメモリを正確に割り当てるため、名前/パス/ファイル/その他の長さの上限についてユーザーに負担をかけることはありません。

可変長配列の欠点:

  • スタックに任意に大きな配列を割り当てることはできません。システムが自動的にスタックを拡張できる場合でも、OS が使用するセンチネル ページ間でスタック ポインターをジャンプさせる配列を割り当てることで、プログラムをセグメンテーション違反にすることができます。通常、数キロバイトは問題ありませんが、数メガバイトは問題です。

固定サイズのバッファーの利点:

  • セットアップが簡単。

  • それらは C++ です。C++11 標準では、C99 (C99 は完全に合法ですが、C++11 ではvoid foo(int n) { typedef int (*)[n]; ... }記述できません)以来、C では可変長配列を typedef することさえ許可されていますが、配列型がランタイム サイズを持つことを明示的に禁止しています。void foo(int n) { int bar[n]; }

固定サイズのバッファの欠点:

  • それらは、固定された制限でユーザーに負担をかける傾向があります。確かに、通常はより多くのメモリが必要になる状況を処理しようとすることはできますが、ほとんどの場合、制限は、ある日非常に不満を抱くユーザーに転送されます。

  • バッファ オーバーランを介してバグを招きます。プログラムは、配列サイズの超過によるすべてのエラーを明示的かつ正確に処理する必要があります。このエラー処理コードに 1 つの間違いがあると、プログラムがクラッシュしてセキュリティ上の脆弱性が生じる可能性があります。可変長配列では、常にジョブに十分な大きさのバッファーを割り当てるため、バッファーがオーバーランする状況に陥ることはありません。


全体として、私は信じて#define N ...おり、int foo[N];ほとんどの場合、悪いスタイルです. 最大サイズが小さいことを証明でき、C++ を作成していない場合は、可変長配列を使用してください。できない場合はmalloc()/new配列。非常に具体的なサイズを超える必要がないことを証明できる場合にのみ (「四次根ソルバーは 4 つを超える根を返すことはない」など)、固定サイズを使用してください。個人的には、ほとんどすべての配列をmalloc()/で割り当てますnew

于 2014-08-31T14:23:01.770 に答える