2012-11-11 38 views
1

我試圖從命令行參數中獲取某個值。然後使用這個值,我將在我的結構中設置整數數組的大小。使用命令行參數聲明結構

我的代碼:

int main(int argc, char* argv[]) 
{ 
    int size_of_heap = atoi(argv[1]); 


    struct s_status 
    { 
     int block_size[size_of_heap]; 
     char status[size_of_heap]; 
    }; 

它給了我「變長數組的聲明無效」的錯誤。

我不明白爲什麼它不起作用,因爲size_of_heap現在應該是通過atoi()從字符串轉換後的整數,所以block_size [size_of_heap]應該與具有block_size [任意數量]相同, 。

預先感謝

+0

它需要是一個常數。 C不允許你聲明可變長度的數組。試試'malloc'。 – irrelephant

+0

@irrelephant其實它允許它。現在已經這麼做了13年;-) –

+0

@irrelephant錯誤..取決於您使用的是哪種標準。 – dmckee

回答

2

您使用的是C標準(或編譯器)不允許可變長度數組的大小。它需要是一個常量,或者您應該使用malloc(size_of_heap * sizeof(arr_datatype))來創建block_sizestatus陣列。

struct s_stats 
{ 
    int *block_size; 
    char *status; 
}; 

struct s_stats my_stats; 
my_stats.block_size = malloc(sizeof(int) * size_of_heap); 
my_stats.status = malloc(size_of_heap); // sizeof(char) is always 1 
2

它不工作,因爲編譯器不知道大小的陣列將擁有(size_of_heap將只能在運行時知道)。

您應該在運行時分配必要的內存,請參閱malloc()

2

您使用的是GCC嗎?如果是,則可以使用GCC的-std=c99-std=gnu99選項在C99模式下進行編譯。默認情況下,GCC只支持舊的C89標準,它不支持可變長度的自動數組。如果您使用的是其他編譯器,請查閱其文檔,瞭解如何使其支持C99而不是C89。

「新」(現在已經老了)C99標準已經存在了13年。儘可能使用它是個好主意。

4

Variable length arrays在C99中引入。如果您不能使用支持超過ANSI C標準的編譯器,聲明你的結構,如:

struct s_status { 
    int *block_size; 
    char *status; 
} 

,並使用malloc()爲在運行時的結構成員分配內存。