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

va_start用法的不懂,该如何处理

2012-09-24 
va_start用法的不懂void simple_va_fun(int i, ...){int j,kva_list arg_ptrva_start(arg_ptr, i)jva_

va_start用法的不懂


void simple_va_fun(int i, ...) 
{

int j,k;

va_list arg_ptr; 

va_start(arg_ptr, i); 
j=va_arg(arg_ptr, int); 
k=va_arg(arg_ptr, int);
va_end(arg_ptr); 


printf("%x\n",&i);
printf("%x\n",&j);
printf("%x\n",&k);

return; 


int main()
{


simple_va_fun(1,2,3); 

return 0;
}


////////////////////////////////////////////////////



这样调用:

int val=1;


simple_va_fun(val,2,3); 能保证val和 simple_va_fun 函数内部的变量j,k 存储连续?


还有谁规定的:i,j k三个变量 存储连续的,求解 变量的地址,对吗?





[解决办法]
不能保证,取决于编译器的实现。
[解决办法]

探讨

自己实现一个stdargs就懂了.

参数从右到左入栈, 栈地址从高向低增长, 所以最左的参数地址最小.

既然是栈上连续布局的一些变量, 自然可以依次访问.

va_start(arg_ptr, i); 是个宏, 作用原理几乎是这样的:

char *addr = (char*)&i + sizeof(i);
long laddr = (long)addr;
lad……

[解决办法]
探讨

自己实现一个stdargs就懂了.

参数从右到左入栈, 栈地址从高向低增长, 所以最左的参数地址最小.

既然是栈上连续布局的一些变量, 自然可以依次访问.

va_start(arg_ptr, i); 是个宏, 作用原理几乎是这样的:

char *addr = (char*)&i + sizeof(i);
long laddr = (long)addr;
lad……

热点排行