2017-05-20 124 views
-2

我讀過關於變量參數函數「int func(int, ...)」的內容。 這些函數的參數在哪裏分配(堆棧或堆)?C函數中的變量參數

因爲我讀到va_end()宏釋放空間分配給va_list,所以「釋放」這個詞引起了我的注意。

注意:我知道常規函數會進入堆棧,但這種類型的函數很有趣,因爲參數的個數是未知的。

我只是想知道它不像沒有預定義空間的數組; 最後我們使用malloc()free()

鏈接:https://www.tutorialspoint.com/cprogramming/c_variable_arguments.htm

+0

與常規參數一樣,通常將可變參數壓入堆棧。你不必擔心'malloc'或'free'。 –

+0

_i只是想知道它不像沒有預先定義的space_數組:數組總是有一個預定義的空間。 –

+0

它有什麼不同? – melpomene

回答

2

本身沒有指定諸如「堆」或「堆」,所以編程標準和便攜式,你最好想在標準分類:靜態,自動和動態存儲。

儘管如此,在一個典型的實現中,「自動存儲」轉換爲「堆棧用於它」。這是函數參數的情況,可變參數函數在這裏也不例外。

原因va_end()可能會釋放一些動態存儲(通常是:在堆中分配)是該va_arg()宏通常需要一些背景信息,找到下一個說法。 va_start()將爲該信息分配內存(不適用於參數本身)並以某種方式對其進行初始化,以使第一個調用返回第一個可變參數。

請注意,va_start()的執行不會分配內存。 va_list可能被定義爲爲所需的上下文信息提供空間。但是,這應該是在所有不感興趣,你作爲程序員,所有的va_*東西是黑匣子你,如果文檔指出「對清理結束後調用va_end()」,你只是做它;)

0

通常平臺有一個調用約定。前幾個參數進入寄存器,隨後的進入堆棧。這對C代碼本身是故意不透明的。 va_start和va_end提供了一個調用約定的包裝器,以允許您按索引而不是按名稱順序訪問參數。

請注意,您無法在運行時構建va_args塊。這是C不允許你做的少數事情之一。您只能通過調用變量args函數來生成塊。

另請注意,實際上,變量參數列表用於將調用包裝到vsprintf()。在生產C代碼中,你幾乎不會發現它們用於其他目的。