首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

函数参数和栈的有关问题

2013-03-14 
函数参数和栈的问题在库函数printf中有这么些宏:typedef char * va_list  #define _INTSIZEOF(n) \  ((si

函数参数和栈的问题
在库函数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的地址,后续的参数都在这个地址后面放着。

热点排行