c語言中處理不定引數

2021-09-01 11:38:09 字數 909 閱讀 7090

c語言中處理不定引數數目

在程序中,堆疊位址是從高到低分配的.當執行乙個函式的時候,將引數列表入棧,壓入堆疊的高位址部分,然後入棧函式的返回位址,接著入棧函式的執行**,這個入棧過程,堆疊位址不斷遞減,一些黑客就是在堆疊中修改函式返回位址,執行自己的**來達到執行自己插入的**段的目的.

在函式呼叫時,第乙個進棧的是主函式中的下一條指令(函式呼叫語句的下一條可執行語句)的位址,然後是函式的各個引數。在大多數的c編譯器中,引數是從右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。

總之,函式在堆疊中的分布情況是:位址從高到低,依次是:函式引數列表,函式返回位址,函式執行**段.

堆疊中,各個函式的分布情況是倒序的.即最後乙個引數在列表中位址最高部分,第乙個引數在列表位址的最低部分.引數在堆疊中的分布情況如下:

最後乙個引數

倒數第二個引數

第乙個引數

函式返回位址

函式**段

uart_acb_dmm_msg_buffer( const byte length, ... )

va_list ap;

va_start(ap, length);//此時ap指向第乙個引數length的位址

for(i = 3; i < (length - 1); i++)

//得到第乙個引數的值並將指標指向下乙個引數

buffer[i] = (byte)va_arg(ap, int);

(1)首先在函式裡定義一具va_list型的變數,這個變數是指向引數的指標;

(2)然後用va_start巨集初始化剛定義的va_list變數;

(3)然後用va_arg返回可變的引數,va_arg的第二個引數是你要返回的引數的型別 (如果函式有多個可變引數的,依次呼叫va_arg獲取各個引數);

(4)最後用va_end巨集結束可變引數的獲取。

c語言中的不定引數

在採用c語言程式設計時,函式中的形式引數數目通常是確定的,在呼叫的時候要依次給出與形式引數對應的所有實際引數,但在某些情況下希望函式的引數個數可以根據需要確定,如printf,scanf函式等,c編譯器提供了一系列處理這種情況的巨集,以遮蔽不同的硬體平台造成的差異,增加程式的可移植性,這些巨集包括v...

C語言中的不定引數

1,最近剛剛知道c語言還有不定引數這麼個東東。2,解決方法 三個巨集的使用va arg va start 和va end 上述的巨集原型如下所示 type va arg va list argptr,type void va end va list argptr void va start va l...

C語言不定引數

最近,遇到乙個c語言的不定引數問題。其實,對於c語言的不定引數問題,只需要三個函式就可以搞定了。這三個函式的標頭檔案是,其實下面的三個函式都是乙個巨集定義 macro 這三個函式是 void va start va list ap,last type va arg va list ap,type v...