2017-02-08 67 views
1

是否可以在堆上分配數組,即使它在函數內部有作用域?這裏是我的C程序:如何在函數內部分配大尺寸數組(在堆上使用動態內存分配)

void SimpleTextEditor() 
    { 
     char textEditor[1000000]; 
     char operationText[1000002]; 
     //do something with the arrays 
    } 

這導致stackoverflow例外,顯然是因爲我想分配兩個大尺寸數組。如果我將任何一個數組移動到函數外部並使其成爲全局變量(文件級變量),那麼它將在全局變量分配到堆上時起作用。

但我不想讓我的變量全局。是不是可以使用malloc和calloc爲數組動態分配內存?

+0

'字符*文本編輯=的malloc(1000000);'...'免費(文本編輯);' –

+0

您可以用'static'? –

+1

「......因爲全局變量被分配在堆上」 - 你從哪裏得到這個想法? – AnT

回答

2

如果我移動陣列中的任何一個在函數外部並使其成爲全局(文件級別變量) ,那麼它將作爲全局變量在堆上分配 。

這是錯誤的假設。定義在文件範圍內的數組很可能被放置在data segment之內,或者更具體地在.bss段內,因爲沒有給出明確的初始化器。

但我不想讓我的變量全局。 是不是可以動態地爲使用malloc和calloc的數組分配內存?

這當然是可以動態地分配使用malloc和朋友的記憶。然而,由於尺寸在編譯時已知的,更好的選擇可以是兩個陣列作爲static聲明:

void SimpleTextEditor() 
{ 
    static char textEditor[1000000]; 
    static char operationText[1000002]; 
    //do something with the arrays 
} 
+2

注意在C新手:這個版本是不可重入,也不是線程安全的 –

+0

所以靜態數組變量,即使它是本地範圍的一個函數,它不會去堆內存區域。是嗎? – RBT

+0

@RBT:是的。它將轉到數據段,就像全局變量一樣。唯一的區別是關於範圍。 –

2

是不是可以爲使用malloc和calloc的數組動態分配內存?

當然是可能的:

char *textEditor = malloc(1000000); 
char *operationText = malloc(1000002); 
//do something with the arrays 
free(operationText); 
free(textEditor); 

(注:你可以使用1000000*sizeof(char),如果你想要的,但sizeof(char)始終爲1)

1

是defineltly可以使用malloc()calloc()和動態分配存儲器。只要將它們分配給函數或main(),如果你不想讓它們成爲全局的話。在處理大數據時,最好在堆上分配空間,以便爲更多數據創建更多空間。

  • 當使用malloc():請求的存儲器堆中

    malloc()分配,然後返回一個void*指向它的指針。

    實施例:

    char *textEditor = malloc(1000000); 
    char *operationText = malloc(1000002); 
    
  • 當使用calloc():請求的存儲器堆中

    calloc()分配,然後返回一個void*指向它的指針。設置內存爲0

    例子:

    char *textEditor = calloc(1000000, sizeof * textEditor); 
    char *operationText = calloc(1000002, sizeof * operationText); 
    
  • 確保安全free()這些底。

    free()解除分配先前由malloc()calloc()realloc()分配的內存。

    例子:

    free(textEditor); 
    textEditor = NULL; 
    
    free(operationText); 
    operationText = NULL; 
    

注:兩個malloc()calloc()可以返回錯誤NULL,所以最好進行檢查。你檢查一下是這樣的:

if (textEditor == NULL || operationText == NULL) { 
    /* handle exit */ 
+0

從C#背景正在爲釋放calloc'字符*文本編輯=釋放calloc(1000000 *的sizeof文本編輯)可以使用的語法;'對我來說是很奇怪的。爲了清楚起見,我可能會將其寫爲'char * textEditor = calloc(1000000,sizeof(char));'。 – RBT

+1

@RBT這也很好。我來自C背景,所以我發現'char * textEditor = calloc(1000000,sizeof * textEditor);'很好。但是他們都做同樣的事情,如果你選擇'sizeof(char)',沒問題。 – RoadRunner