0

関数に次のコードがある場合、エラーは発生せず、問題なくコンパイルできますが、グローバルスコープに入れると、「サイズ0の配列を割り当てることができません」というエラーが発生します。他のいくつかのエラー。なぜこれが発生し、どうすればエラーを取り除くことができますか。私はグローバル変数のリスクを認識しています。これは単なるテストケースです。

int* intest[2];
intest[0] = new int;
4

3 に答える 3

1

グローバルスコープでの宣言は許可されていますが、new演算子または割り当ての使用は許可されていません。したがって、グローバルスコープで宣言int * intest [2]が必要です(そしてすべてのコードがそれを認識します)が、C++では新しいものがメインコードのシーケンスにある必要があります。(おそらく、アプリのある種の起動機能で)。

編集:@phresnelで指摘されているように、このスコープではnew演算子を使用できますが、割り当ては使用できません(これは異常ですが、違法ではありません)。ただし、開始として使用される次の新しい演算子は機能します。

int *x[2]={new int,new int};

一般に、このようなグローバルバッファの使用は非常に推奨されておらず、アンチパターンと見なされます。使用を回避できる場合は、おそらく使用する必要があります。

于 2012-04-18T07:58:49.903 に答える
1
int* intest[2];

ただし、ローカルスコープに配置することは有効です:

intest[0] = new int;

ではありません。

違いは、上のものが初期化ステートメント (変数の作成) であり、下のものが実行されたコード セグメントであることです。

「実行」する必要があるコードは、グローバル スコープで呼び出すことはできません。たとえば、グローバル スコープで関数を呼び出すことはできません。その関数はいつ呼び出されますか?

グローバル スコープで必要な変数をいくつでも作成できますが、グローバル変数の初期化時に呼び出されるコンストラクター以外からコードを実行することはできません。

次のようなコードを実行する場合:

intest[0] = new int;

メインまたは別の関数を介して実行する必要があります。そうしないと、プログラムはいつ実行するかわかりません。

于 2012-04-18T08:27:31.717 に答える
0

AFAIK、グローバルスコープでは、置くことしか許可さdefineれていませdeclarationん。一方intest[0] = new int;、コンパイル中に c/c++ コンパイラが失敗するという割り当てです。

于 2012-04-18T08:06:26.623 に答える