alloca 和 變長陣列(VLA)

2021-10-03 22:40:07 字數 976 閱讀 1888

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...