2010-11-21 57 views
6

我有一個數組,我想使全局,我想在函數調用初始化。 我想首先聲明它不知道它的大小:C - 在函數中初始化全局數組

char str[]; 

後來初始化:

str = char[size]; 

我怎樣才能做到這一點? 我對c很陌生,也許我在這裏完全錯誤的方式,任何幫助將不勝感激。

回答

7

要做到這一點的方法是malloc。在init函數,你malloc

char *str; 

然後:一是申報只是一個指針

str = malloc(sizeof(*str) * size_of_array); 

這是分配點str向(在這種情況下char)大小的size_of_array元素。

你應該檢查分配失敗:

if (str == NULL) { 
    // allocation failed 
    // handle the error 
} 

通常你必須確保你free這個分配的內存當你用它做。但是,在這種情況下,str是全局的,所以它不會超出範圍,程序結束時內存將爲freed。

+4

在C,你真的不應該投malloc的結果 - 你只有在C++中真的需要這麼做 - 它應該在C中避免,因爲它可以屏蔽其他有用的警告。 – 2010-11-21 21:06:18

+2

如果你想成爲一般的,使用'sizeof(* str)',所以你不必重複類型名稱。此外,在C中,您不應該投射malloc的結果。 – 2010-11-21 21:06:31

+2

@Paul,@Ben:謝謝,我更新了anwer – 2010-11-21 21:08:12

1
char* str; 

str = (char*)malloc(size*sizeof(char)); 

根據定義,您可以跳過*sizeof(char),因爲sizeof(char) == 1

不要忘了取消分配使用free

+2

如果您想成爲一般人,請使用'sizeof(* str)',這樣您就不必重複類型名稱。此外,在C中,您不應該投射malloc的結果。 – 2010-11-21 21:06:10

+1

在C中,你不應該真的投射malloc的結果 - 你只需要在C++中做到這一點 - 它應該避免在C中,因爲它可以屏蔽否則有用的警告。 – 2010-11-21 21:06:53

1

創建char* str;而不是數組的內存。然後,使用malloc或calloc分配所需的內存量,並在函數調用中進行初始化。

2

讓您的全局數組聲明是這樣的:

char *str = NULL; 
在你的初始化函數

然後做這樣的事情:

void init(int size) 
{ 
    ... 
    str = malloc(size * sizeof(char)); 
    ... 
} 
+1

'sizeof(char)'的定義是1。如果你想編寫適用於任何類型的代碼,可以使用'sizeof(* str)'。 – 2010-11-21 21:08:59

+0

@Ben:true,但無論類型如何,包含'sizeof'都是一個好習慣。我很清楚支持'sizeof(* str)'的參數,但在這種情況下我仍然更喜歡'sizeof(char)'。 – 2010-11-21 21:11:28