2009-01-15 76 views
7

在這裏動態存儲器的討論:"Intro to C Pointers and Dynamic Memory"可變尺寸的陣列VS釋放calloc用C

作者指出:

像這樣的存儲器塊可有效地用作一個更靈活的陣列。這種方法實際上在現實世界的C程序中更爲常見。它也比「可變大小的數組」

類型存儲器塊他所談論的是這樣更可預測的和靈活的:

const int size = 5; 
int * array = calloc(size, sizeof(int)); 

,然後使用另一個指針進行迭代陣列之上:

int * index = array; 
for (i = 0; i < size; i++) { 
    *index = 1; // or whatever value 
    index++; 
} 

我的問題是如何是該方法比標準可變尺寸的陣列更好這樣?:

int array[variable]; 

或動態:

char name[] = "Nick"; 

筆者並沒有真正擺脫多的光,爲什麼我應該更喜歡前一種方法後者。或者更具體地說:它如何更「可預測和靈活」?

+2

[malloced陣列VS.的可能的複製可變長度數組](http://stackoverflow.com/questions/16672322/malloced-array-vs-variable-length-array) – 2016-04-23 07:37:46

回答

10

如果聲明int array[variable]內存將被分配在堆棧上,這對於較大的,相對永久的數據結構(例如您可能想要返回的數據結構)來說不是很好。如果使用數組語法,則不需要手動釋放內存,因爲它在超出範圍時被釋放。另一方面,calloc將在運行時在堆上動態分配內存。完成後您必須自行解鎖。

+0

http://gcc.gnu.org/onlinedocs/gcc/Variable-Length。 html – 2009-01-15 23:09:49

0

由於

int array[variable]; 

不在標準C有效 - 你只能以恆定定義數組的長度。 (例如您的

char name[] = "Nick"; 

示例,它不是可變長度)。

因此,如果您想基於程序變量創建一個長度數組,則需要使用像calloc()這樣的內存分配器。

只是不要忘記釋放()它。

+0

確實,它不是可變長度。我想我應該把「動態」。由於編譯器確定應該分配多少。 – nmiller 2009-01-15 23:10:54

8

我ocdecio是同意不允許

int array[variable] 

允許某些類型的變量和表達式是數組的大小。但除此之外,使用realloc可以調整分配給malloc和家人的東西。

3

在堆棧中使用可變大小的數組作爲自動變量(而不是使用calloc/malloc/new/etc的堆)對於要運行很長時間的進程並不是一個壞主意,製作並銷燬大量的小陣列。這是因爲堆棧保證不會變得碎片化,而內存可以並且會碎片化。如果您正在編寫固件或需要多年運行而不停止的服務,則幾乎禁止使用malloc或new。

2

在ISO C99中允許使用變長自動數組,並且作爲擴展GCC在C90模式和C++中接受它們。 因此,不要設置編譯器標誌-std = c99或-std = gnu99。下面的例子將工作

#include<stdio.h> 

int main() 
{ 
    int n; 
    printf("\n\tEnter the number of digits: "); 
    scanf("%d", &n); 

    char str[n]; 
    for(int i=0; i < n; i++) { 
     scanf("%s", &str[i]); 
    } 

    printf("\n\tThe entered digits are: %s", str); 
return 0; 
} 

我garantee是:-)