【发布时间】:2021-01-20 07:30:09
【问题描述】:
void va_test2(va_list ap2)
{
printf("va_test 2 : %d\n", va_arg(ap2, int));
}
void va_test1(const char* str, ...)
{
va_list ap1;
printf("%s\n", str);
va_start(ap1, str);
va_test2(ap1);
printf("va_test 1 : %d\n", va_arg(ap1, int));
va_test2(ap1);
}
int main(void)
{
va_test1("this is a test", 1, 2, 3);
}
result :
this is a test
va_test 2 : 1
va_test 1 : 2
va_test 2 : 3
result I expected:
this is a test
va_test 2 : 1
va_test 1 : 1
va_test 2 : 2
在我看来,va_list 'ap1'在'va_test1'中初始化后,它被复制到'va_test2'中的局部变量'ap2'中。
所以va_arg(ap, int) 增加'va_test2'中的va_list 'ap2'后,应该不会影响原来的va_list 'ap1'。
但行为表明增加的参数实际上影响了“ap1”。
据我所知,va_arg 已定义
#define va_arg(ap, t) (*(t*)((ap += _INTSIZEOF(T)) - _INTSIZEOF(T)))
直接增加发送的指针。
在我的结论中,va_list 似乎是静态行为,无论它在哪里声明。
你能告诉我这是对的吗,为什么它会显示静态行为?
【问题讨论】:
-
关于
c的问题,请不要标记c#- 因为它是一种完全不同的语言 -
va_test2(ap1);后跟 anything else(在ap1上)然后va_end(ap1)是未定义的行为。在va_test2(ap1)之后对va_arg(ap1的调用是未定义的行为。 -
As far as I know, va_arg is defined你从哪里得到这个定义?你怎么知道这是真的?