读书人

函数参数和栈的有关问题

发布时间: 2013-03-14 10:33:15 作者: rapoo

函数参数和栈的问题
在库函数printf中有这么些宏:
typedef char * va_list;

   #define _INTSIZEOF(n) \
   ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

   #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

   #define va_arg(ap,t) \
   ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

   #define va_end(ap) ( ap = (va_list)0 )

其中的第三个宏:#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
不是很懂,在k&R的c中是这样定义printf函数的:

void minprintf(char * fmt,...)
{ va_list ap;
......
va_start(ap,fmt);
......
}
fmt是形参,va_start(ap,fmt);就等于 ap = (va_list)&fmt + _INTSIZEOF(fmt);
执行完这一句后ap就指向下一个变量,就是第一个不定变量。函数的参数是压入栈里的吧,从右至左压入,
那么fmt变量即形参也是在栈里吗?
是不是所有的形参都是分配在栈里?


[解决办法]
对的,形参在栈里顺序排列,并且每个参数的地址都在sizeof(int)倍数地址上对齐。

所以获取fmt的地址,后续的参数都在这个地址后面放着。

读书人网 >C语言

热点推荐