0

重複の可能性:
グローバル変数によって決定されるサイズの配列を作成できないのはなぜですか?

以下に示す式を使用して配列を初期化し、すべての値をゼロに代入しようとしています。

byte arg_listB[2*num_args+10]={0};  

これにより、次のエラーが発生します。

error: variable-sized object 'arg_listB' may not be initialized

しかし、式を実際の数値に置き換えると機能します

byte arg_listB[10]={0};  

なぜ?そして、どうすればこれを修正できますか?

4

3 に答える 3

1

静的配列を宣言するときは、リテラルや定数変数などの定数値を使用する必要があります。#defineコードを読みやすく管理しやすくしたい場合は、キーワードを使用してリテラルに名前を割り当てたり、定数変数を宣言して初期化したりできます。

#define NUM_ARGS 5
/*...*/
byte arg_listB[NUM_ARGS];

ただし、式を使用して配列のサイズを設定するには、ポインターを使用して動的配列を作成する必要があります。これがどのように行われるかは、使用している言語によって異なります。Cでは、次のようにcalloc関数を使用して配列を作成できます。

#include <stdlib.h> //required for calloc
/*...*/
int num_args = 5;
byte* arg_listB = (byte*)calloc(2*num_args+10, sizeof(byte));

これにより、配列のサイズのメモリブロックが動的に作成され、最初のバイトのアドレスがポインタに割り当てられます。注意すべき点の1つはcalloc、配列内の要素を自動的に0に初期化するため、その部分はすでに完了しているということです。もちろん、次のようにアレイを使い終わったら、割り当てたメモリをクリーンアップすることも忘れないでください。

free(arg_listB);

<cstdlib>技術的には、ヘッダーを含めると、C++でこれらの関数を使用できます。ただし、C ++には、動的メモリ割り当てのための独自の特別なキーワードが newありdeleteます。これらは次のように使用できます。

/*...*/
int num_args = 5;
byte* arg_listB = new byte[2*num_args+10];
//initialize your array

//free the memory when done with the array
delete[] arg_listB;

コメントに記載されているように、配列を宣言した後に配列を初期化する必要があります。また、配列を使い終わったら、メモリを解放することを忘れないでください。メモリ管理と動的配列には、ここで説明できる以上のことがたくさんあるので、それらを調べることを強くお勧めします。これが役立つかもしれないいくつかの記事です:

C: アレイ動的メモリ

C ++:動的メモリ

于 2012-09-09T06:33:31.587 に答える
0

あなたのC++タグは間違っていると思います。その言語には、使用している可変長配列(VLA)の概念がありません。つまり、サイズが変数に依存する配列を宣言しています。(C ++には、この目標のための他のツールがあります。)

Cでは、VLAを初期化できません。個々のメンバーに割り当てるか、Cライブラリ関数を介してバイトを設定する必要がありますmemset

于 2012-09-09T08:42:53.260 に答える
0

配列宣言の初期化子は、動的サイズの配列ではなく、静的サイズの配列に対してのみ機能します。次の 2 つのいずれかを実行できますnum_args。コンパイル時の定数を作成するか (#defineおそらく を使用)、個別に割り当てて初期化します。

byte arg_listB[2*num_args+10];
bzero(arg_listB, 2*num_args+10);
于 2012-09-09T05:37:59.233 に答える