直接从堆栈获取变量参数

时间:2011-08-23 20:32:10

标签: c

我正在玩堆栈和函数的调用参数。 我想在这里实现的是直接使用堆栈获取变量参数的值。

当我不使用变量参数时,它工作(或似乎工作)很好。 这是有效的:

void test(int a, int b)
{
  unsigned char *ptr;
  int i;

  ptr = (unsigned char*)&a;
  for (i = 0; i < 4; i++)
    {
      printf("%d,", *ptr);
    }    
}

有效,我可以检索b的值; 使用

的相同代码
void test(int a, ...);

因为函数的原型不起作用。

我无法理解这里发生了什么。

你能帮帮我吗? 谢谢!

编辑: 好吧,那么它看起来没有稳定可靠的方法来自己做那种事情。 让我们说在callee函数中我知道变量参数的数据大小(但不是类型),有没有办法抓住它们?

2 个答案:

答案 0 :(得分:2)

只要您知道或可以确定参数的数量,就可以使用<stdarg.h>中的宏:

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

void test1(int n, ...)
{
    va_list args;
    va_start(args, n);
    for (int i = 0; i < n; i++)
    {
        int j = va_arg(args, int);
        printf("%d: %d\n", i, j);
    }
    va_end(args);
}

void test2(int a, ...)
{
    va_list args;
    int i = 0;
    printf("%d: %d\n", i++, a);
    va_start(args, a);
    int j;
    while ((j = va_arg(args, int)) > 0)
        printf("%d: %d\n", i++, j);
    va_end(args);
}

区别在于如何调用这两个函数:

int main(void)
{
    test1(4, 1, 3, 7, 9);
    test2(1, 3, 7, 9, 0);
    return(0);
}

printf()家族使用替代但等效的技术;这些函数扫描格式字符串并根据格式字符串中的信息确定每个参数的类型(以及参数数量)。所以,您的主要选择是:

  • count - test1()
  • sentinel - test2()
  • 格式字符串 - printf()

答案 1 :(得分:1)

在带有...的函数中,您可以使用va_ * macro

void test(int a, ...) {
  va_list ap;
  va_start(ap, a);
  // Your code
  va_end(ap);    
}