看到面試題C語言中函數參數的入棧順序如何?
自己不知道,邊上網找資料。下面是詳細解釋
#include <stdio.h>
void foo(int x, int y, int z)
{
printf("x = %d at [%X]/n", x, &x);
printf("y = %d at [%X]/n", y, &y);
printf("z = %d at [%X]/n", z, &z);
}
int main(int argc, char *argv[])
{
foo(100, 200, 300);
return 0;
}
運行結果:
x = 100 at [BFE28760]
y = 200 at [BFE28764]
z = 300 at [BFE28768]
C程序棧底為高地址,棧頂為低地址,因此上面的實例可以說明函數參數入棧順序的確是從右至左的。可到底為什么呢?查了一直些文獻得知,參數入棧順序是和具體編譯器實現相關的。比如,Pascal語言中參數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如Visual C++。即然兩種方式都可以,為什么C語言要選擇從右至左呢?
進一步發現,Pascal語言不支持可變長參數,而C語言支持這種特色,正是這個原因使得C語言函數參數入棧順序為從右至左。具體原因為:C方式參數入棧順序(從右至左)的好處就是可以動態變化參數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的參數被壓在棧底。除非知道參數個數,否則是無法通過棧指針的相對位移求得最左邊的參數。這樣就變成了左邊參數的個數不確定,正好和動態參數個數的方向相反。
因此,C語言函數參數采用自右向左的入棧順序,主要原因是為了支持可變長參數形式,C語言中可變參數都是從左到右,所以不管你有多少個參數反正將最右面的那個壓入棧底,最左面的參數出入棧頂。換句話說,如果不支持這個特色,C語言完全和Pascal一樣,采用自左向右的參數入棧方式
博文選自C語言參數的入棧的順序