c - 重新注入(inject)变量参数列表 C 语言

标签 c compilation variadic-functions

我尝试重新注入(inject)变量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

我不明白参数不在堆栈上。 它似乎与局部变量链接。我想我必须移动堆栈指针,但我不知道该怎么做。

最佳答案

发表评论后,必须使用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);
}

关于c - 重新注入(inject)变量参数列表 C 语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39504712/

相关文章:

python - 我可以打包 cpython 吗?

用于生产的 Angular2 编译

java - 为什么不能将 @SafeVarags 应用于最终类中的实例方法?

C++ 编译器优化和短路评估

xml - R 上包 ‘XML’ 的编译失败

c++ - 如何仅在复制构造函数存在时调用它?由 小码哥发布于

c++ - 如何在 C++ 中建立一个 va_list

c - 如何为 SQLite 做增量备份?

python - 是什么导致 C 程序不能在 Arduino 中正确地递增变量?

c - 函数 getopt() 的变量 optarg