重新注入变量参数列表C lang

时间:2016-09-15 06:52:55

标签: c compilation variadic-functions

我尝试重新注入变量arg throw函数:

#include < stdio.h >

  int test_va_arg(char * fmt, ...) {
    int c;

    c = printf(fmt);

    return (c);
  }

int test_va_arg2(char * fmt, ...) {
  int c;
  char buf[1024];

  sprintf(buf, "ADD->%s", fmt);
  c = printf(buf);

  return (c);
}

int test_va_arg3(char * fmt, ...) {
  int c;
  char * buf;

  buf = malloc(1024);
  sprintf(buf, "ADD->%s", fmt);
  c = printf(buf);

  return (c);
}

int main(void) {
  int c;

  c = test_va_arg("test_va_arg : %d %d %d\n", 421, 847, 1003);
  printf("test_va_arg2 :%d\n", c);
  c = test_va_arg2("test_va_arg2 : %d %d %d\n", 421, 847, 1003);
  printf("test_va_arg2 :%d\n", c);
  c = test_va_arg3("test_va_arg3 : %d %d %d\n", 421, 847, 1003);
  printf("test_va_arg2 :%d\n", c);
  c = test_va_arg("test_va_arg : %d %d %d\n", 421, 847, 1003);
  printf("test_va_arg2 :%d\n", c);
  return (0);
}

输出

# ./test_va_arg 
test_va_arg : 421 847 1003
test_va_arg2 :27
ADD->test_va_arg2 : 4196615 178862877 2147483618
test_va_arg2 :49
ADD->test_va_arg3 : 4196615 13586477 2147483618
test_va_arg2 :48
test_va_arg : 421 847 1003
test_va_arg2 :27

我不明白这个论点不在堆栈上。 它似乎与本地变量有关。我想我必须移动堆栈指针,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

发表评论后,您必须使用vprinf,如:

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

int test_va_arg(char * fmt, ...)
{
    va_list args;
    int c;

    va_start(args, fmt);
    c = vprintf(fmt, args);
    va_end(args);

    return (c);
}

int main(void) {
  int c;

  c = test_va_arg("test_va_arg : %d %d %d\n", 421, 847, 1003);
  printf("test_va_arg2 :%d\n", c);

  return (0);
}

在发表其他评论后,您可以使用宏来完成工作

#include <stdio.h>

#define test_va_arg(fmt, ...) fprintf(stdout, fmt, ##__VA_ARGS__)

int main(void)
{
    int c;

    c = test_va_arg("test_va_arg : %d %d %d\n", 421, 847, 1003);
    printf("test_va_arg2 :%d\n", c);

    return (0);
}