alloca 是gnu libc中的記憶體分配函式。
void func()
一般來說,alloca 的記憶體是在呼叫alloca的函式func 的棧上分配的,當func 返回或者異常退出的時候,分配的記憶體或自動釋放。
以上說的是一般的情況。下面說說不一般的情況:
在hp-ux 系統上時,或者在其他的一些系統並且使用c++ 編譯器時。在這些系統上,alloca是基於malloc的模擬。這種模擬並不會在func 返回時立馬釋放記憶體,而是在下一次呼叫alloca的時候才會釋放。
需要注意的是,gcc 3.1 and 3.2可以把呼叫alloca的呼叫者 func 給內聯。當這種情況發生時,alloca申請的記憶體直到func的呼叫者func 返回的時候才會釋放。就像下面那樣:
void func()
如果 在func 迴圈呼叫func ,像下面這樣,
void func()
}
很容易造成棧溢位。
為了防止棧溢位,可以使用一下屬性來禁止func 內聯
#ifdef __gnuc__
__attribute__ ((__noinline__))
vla 全稱是variable-leng array ,是c99的標準,當時在c11卻已到了gcc的語言拓展中。
一般來說,在c語言中,宣告陣列的時候,需要用乙個常量指定陣列的長度。
就像下面這樣
int array1[16];
const int arr2len = 32;
int array2[arr2len];
但是,有了vla 之後,我們可以向下面這樣動態指定陣列的長度
float read_and_process(int n)
多維陣列 陣列指標 函式 變長陣列VLA
include define cls 2 define row 2 這三種形式等價 int sum 2 int cls int int sum 2 int cls int intsum 2 int a cls int n 這三種形式等價 int sum 3 int cls row int int s...
C99中的變長陣列(VLA)
處理二維陣列的函式有一處可能不太容易理解,陣列的行可以在函式呼叫的時候傳遞,但是陣列的列卻只能被預置在函式內部。例如下面這樣的定義 define cols 4 int sum3d int ar cols int rows 現在假定了如下的陣列 int array1 5 4 int array2 10...
C C 之變長陣列 VLA 和可伸縮型陣列成員
陣列主要用來處理一系列同型別的資料集合,在c c 中應用十分廣泛。其中有兩種特殊的陣列,變長陣列 vla 和可伸縮型陣列成員,應用得當的話,會非常方便。變長陣列 vla 在多維陣列中,陣列的行可以在函式呼叫時傳遞,但是陣列的列一般在函式內部定義。如下所示 define cols 4 int sum2...