2012-09-11 53 views

回答

2

一種方法是使用VLA(C99定義了所謂的「可變長度陣列」)。

下面是一個例子:

#include <stdio.h> 

int use_a_vla (int n) 
{ 
    int vla[n]; /* Array length is derived from function argument. */ 

    vla[0] = 10; 
    vla[n-1] = 10; 

    return 0; 
} 

int main (void) 
{ 
    int i; 

    scanf ("%d", &i); /* User input. */ 

    use_a_vla (i); 
} 
6

這一切都取決於編譯器。

可變長度自動數組被允許在ISO C99,並作爲擴展 GCC 接受它們C90模式和C++。這些數組 與其他自動數組一樣聲明,但其長度不是常量表達式。存儲在 聲明處分配,並在退出支架級別時解除分配。對於 例如:

FILE * 
concat_fopen (char *s1, char *s2, char *mode) 
{ 
    char str[strlen (s1) + strlen (s2) + 1]; 
    strcpy (str, s1); 
    strcat (str, s2); 
    return fopen (str, mode); 
} 

更多信息請參見this

0

嗯,這是迂腐,但你可以寫你自己的堆管理代碼,並調用你的內存分配函數除malloc()以外的東西。我希望這個答案有趣而不是煩人。

1

如果你沒有VLAS或alloca(),這裏是一個非常缺憾,但便攜,基於堆棧的技術:

int foo(int size) 
{ 
    if (size <= 64*1024) 
    { 
     unsigned char arr[64*1024]; 
     return bar(arr, size); 
    } 
    else if (size <= 1*1024*1024) 
    { 
     unsigned char arr[1*1024*1024]; 
     return bar(arr, size); 
    } 
    else if (size <= 64*1024*1024) 
    { 
     unsigned char arr[64*1024*1024]; 
     return bar(arr, size); 
    } 
    else 
     return -1;  // Assume it's too big 
} 

int bar(unsigned char arr[], int size) 
{ 
    ...your code goes here... 
} 

int maincode(int size) 
{ 
    // Invoke bar() indirectly, allocating an array 
    // on the stack of at least 'size' bytes 
    return foo(size); 
} 

我並不特別推薦這種技術,但它會給你不同在堆棧上分配的大小內存塊,而不是堆。

0

我假設你試圖避免malloc,因爲你不知道realloc

本質上,你應該試圖做大致的C++向量。一旦你的陣列增長到一定的大小,realloc它的大小是它的兩倍。如果可能的話

realloc將增長你的內存塊,如果沒有可能它會malloc一個新的跨越和複製內容。

相關問題