C C++函数调用时的参数传递方法根据架构、编译器、函数调用方式的不同而有所不同,本文讲的是i386架构上使用C C++语言GNU编译器的情况。
在i386上,原则上参数全部堆放到栈上,以下用一个例子验证,编写如下程序并编译:
#include <stdio.h>void func(int a, long b, short c, char d, long long e,float f, double g,int* h, float* i, char* j)
{printf("func");
}int main()
{int pint = 1;float pfloat = 0.01;char buf[6] = {'H', 'e', 'l', 'l', 'o', '\0'};func(250, 25000L, 10, 'F', 123456789LL, 3.14, 3.1415926e8, &pint, &pfloat, &buf[0]);return 0;
}
i386架构中栈的开头保存了返回地址,并且整数或指针类型的大小为4字节。
将以上程序编译得到test程序:
root-> g++ -c -pipe -g -Wall -Wextra -fPIC -o main.o ./main.c
root-> g++ -o test main.o
使用gdb运行程序并设置断点在func函数处:
root-> gdb ./test
gdb> b func