读书人

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

发布时间: 2012-09-24 13:49:41 作者: rapoo

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……

读书人网 >C语言

热点推荐