在内存中键入va_list表示

时间:2017-03-27 15:33:10

标签: c

在阅读thisthis之后,我明白了

void va_start(va_list ap, last);

va_list pa中保存有关被调用函数不知道其数量和类型的参数的一些信息。以后的参数可以通过va_arg()提取。

文档未指定va_list pa内容的放置方式
简而言之:我需要知道它是如何被保存在记忆中的。它的记忆表示。

#include<stdarg.h>
#include<stdio.h>

int sum(int, ...);

int main(void)
{
   printf("Sum of 10, 20 and 30 = %d\n",  sum(3, 10, 20, 30) );
       return 0;
}

int sum(int num_args, ...)
{
   int val = 0;
   va_list ap;
   int i;

   va_start(ap, num_args);
   for(i = 0; i < num_args; i++)
   {
      val += va_arg(ap, int);
   }
   va_end(ap);

   return val;
}

pa中存储了哪些信息?对于上面的例子,它在内存中的表现如何? 从上面的例子中它知道类型是int而不是其他什么?

1 个答案:

答案 0 :(得分:1)

它依赖于实现。有时,va_list只是char*。基本上,ap表示一个指向字符的指针数组。调用va_arg(ap, TYPE)时,它会从ap点的地址读取内存,但会将其读取为TYPE类型。因此,如果您使用int调用它,它将读取4个字节并将其转换为int类型。