関数に次のコードがある場合、エラーは発生しません。問題をコンパイルすることはできますが、一度グローバルスコープに入れると「いくつかの他のエラーとともに、「サイズゼロの配列を割り当てることができません」というエラー。なぜこれが起こり、どうすればエラーを取り除くことができますか?グローバル変数のリスクを認識していますが、これは単なるテストケースです。グローバルスコープで配列の添字にアクセスできないのはなぜですか?
int* intest[2];
intest[0] = new int;
関数に次のコードがある場合、エラーは発生しません。問題をコンパイルすることはできますが、一度グローバルスコープに入れると「いくつかの他のエラーとともに、「サイズゼロの配列を割り当てることができません」というエラー。なぜこれが起こり、どうすればエラーを取り除くことができますか?グローバル変数のリスクを認識していますが、これは単なるテストケースです。グローバルスコープで配列の添字にアクセスできないのはなぜですか?
int* intest[2];
intest[0] = new int;
グローバルスコープでの宣言は許可されていますが、新しい演算子または割り当ては使用できません。したがって、グローバルスコープ内でint * intest [2]という宣言が必要ですが、すべてのコードでそれを見ることができますが、C++ではメインコードのシーケンスにnewが必要です。 (おそらくアプリのスタートアップ機能のいくつかの並べ替えで)。
EDIT:@phresnelによって指摘されているように、このスコープではnew演算子を使用できますが、割り当てはできません(これは通常ではありませんが、違法ではありません)。しかし開始として使用し、次の新しい演算子はあなたのために動作します:
int *x[2]={new int,new int};
一般に、このようなグローバルバッファを使用することは非常に落胆し、アンチパターンと考えられている - あなたは、おそらくそれをすべき使用を避けることができるかどうか。
AFAIKでは、グローバルスコープではdefine
とdeclaration
を入力することしかできません。一方、intest[0] = new int;
は、コンパイル中にc/C++コンパイラが失敗するという割り当てです。
これはなぜ許可されないのですか? – judeclarke
これはc/C++ルールです。 c/C++は、最初の行コードから最後の行コードまで実行するスクリプト言語ではありませんが、すべての実行コードはメソッドに留まり、メソッド** main **から開始する必要があります。 – Sylvester
int* intest[2];
しかしローカルスコープで有効な配置です:
intest[0] = new int;
ではありません。
違いは、上位のものは変数の作成であり、下位のものはのコードセグメントです。
コード"実行"はグローバルスコープで呼び出すことはできません。たとえば、グローバルスコープ内で関数を呼び出すことはできません。その機能はいつ呼び出されますか?
グローバルスコープで必要な変数の数を作成できますが、グローバル変数を初期化するときに呼び出されるコンストラクタを除いて、そこからコードを実行できません。
次のようなコードを実行したい場合:
intest[0] = new int;
をあなたはがそれを実行するとき、それ以外のプログラムがを知っているだろう、メイントラフまたは別の関数を実行する必要があります。
あなたは何を意味するのですか? – David
これは奇妙なことですが、グローバル変数に対して新規または割り当てを使用できないのはなぜですか? – judeclarke
@judeclarke:ちょっとした正気を保つだけです。一般的な文を名前空間のスコープに入れることができれば、別々のコンパイルを検討して、どのような順序で実行するのでしょうか?これが初期化の問題です。これは「グローバル初期化失敗」と呼ばれます。あなたのために、イニシャライザとして何らかの効果を持つ式を置くことができます。これは、C++の適切なモジュールがないことと結びついています。 –
-1:もちろん、あなたはグローバルスコープで 'new'と代入を使うことができます。例: 'int * x、* y = x = new int; int main(){} ' –