2012-09-09 66 views
0

Possible Duplicate:
Why can't I create an array with size determined by a global variable?初始化一個數組用表達

我試圖初始化使用表達式如下面看到的那樣,然後,指派的所有值爲零的陣列。

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

這將產生錯誤:

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

,但如果我有一個實際的數字替換表達它的工作原理

byte arg_listB[10]={0}; 

爲什麼?我該如何解決這個問題?

+2

在C++中,通過利用諸如'std :: array'和更相關的'std :: vector'之類的東西來解決這個問題。在C(至少C99)中,可以使用VLA作爲該語言的一部分。 – chris

+0

@chris我不認爲'std :: array'會解決它......但是'std :: vector'肯定會! – oldrinb

+0

@oldrinb,我在'std :: vector'的建議中幾乎總是包含'std :: array'。前者是固定大小數組的好替代品。 – chris

回答

0

爲一個數組聲明初始化器僅適用於靜態大小的數組,而不是動態大小的陣列。你可以做兩件事情之一 - 要麼使num_args編譯時間常數(用#define,可能),或者分配並分別初始化:

byte arg_listB[2*num_args+10]; 
bzero(arg_listB, 2*num_args+10); 
+1

請不要繼續在C++中使用#define。 – chris

+1

...並不建議使用'bzero',它已被棄用POSIX(['std :: memset'](http://en.cppreference.com/w/cpp/string/byte/memset)也許?) tbh我寧願使用'std :: fill(std :: begin(arg_listB),std :: end(arg_listB),0);';-) – oldrinb

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)); 

這將動態創建一個內存塊的數組的大小和第一個字節的地址分配給您的指針。有一點要注意的是,calloc自動初始化您的數組爲0的元素,所以這部分是你已經做了。當然,你也將要記得清理一次你與你的陣列做這樣你分配的內存:

free(arg_listB); 

從技術上講,你可以用C中使用這些函數++如果包括<cstdlib>頭。然而,C++有動態內存分配自己的特殊的關鍵字:newdelete。這些可以用於像這樣:

/*...*/ 
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: ArraysDynamic Memory

C++:Dynamic Memory

0

我覺得你的C++代碼是錯誤的,這種語言不具有可變長度的概念數組(VLA),即聲明一個數組,其大小取決於一個變量。 (C++爲此目標提供了其他工具。)

在C中,VLA無法初始化,您必須分配給各個成員或通過C庫函數memset設置字節。