我尝试重新注入变量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
我不明白这个论点不在堆栈上。 它似乎与本地变量有关。我想我必须移动堆栈指针,但我不知道该怎么做。
答案 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);
}