聘我网

新概念招聘3.0

C中可变参数实现原理是什么?

vote up0vote downstar

按理C是一种要求严格类型检测的语言,

它是如何达到这种动态效果的?

 

1 个答复

vote up0vote downcheck

是通过

var_list

以及

var_start,var_arg,var_end

实现的。

前者是个指针类型,后3者是个宏。

var_list

var_start,var_arg,var_end

原理就是,编译器会把参数从右至左压栈,

且内存空间连续

因此只需找到这块内存空间的首地址(var_start),

然后每读一个参数,加上这个参数在内存中占的大小(var_arg),

就是下一个参数的地址,这样就能依次得到每一个参数。

看个例子:

int sum(int data,...)
{
    int i=data,s=0;
    va_list vl;
    va_start(vl,data);
    while(i!=-1)
    {
       s+=i;
       i=va_arg(vl,int);
    }
    va_end(vl);
    return s;
}

...
int s=sum(1,2,3,4,5,-1);
...
  1. va_list vl;就是一个char *指针。
  2. va_start(vl,data);就是取到data之后的参数,也就是可变参数的首地址。
  3. va_arg(vl,int);,从当前内存位置取一个int类型的参数,并把指针后推相应距离。
  4. va_end(vl);就是把用完的指针置0

以上都可以根据相应的定义直接看出来~

参考资料:

解析可变参数函数的实现原理(printf,scanf)

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.