[英]Why does this variadic function code produce random results on every run?
由于double
和unsigned long
的大小相同, va_arg
应该从堆栈中弹出相同数量的字节,并且每次运行程序时显示的值都应该相同,因为double
值不会改变。 但事实并非如此,显示的值在相邻的 memory 单元格中无处可寻。
在 gcc 版本 9.4.0 上测试。
#include <stdio.h>
#include <math.h>
#include <stdarg.h>
void test(int num, ...)
{
va_list arguments;
va_start(arguments, num);
unsigned long x = va_arg(arguments, unsigned long);
printf("%lu\n", x);
va_end(arguments);
}
int main(void)
{
double x = 1.234;
printf("sizeof(double) = %zu\n", sizeof(x));
printf("sizeof(unsigned long) = %zu\n", sizeof(unsigned long));
test(1, x);
}
由于
double
和unsigned long
的大小相同,va_arg
应该从堆栈中弹出相同数量的字节...
不。
C 未指定不同类型的参数传递机制相同,也未从堆栈中指定。 *1
OP 的代码具有未定义的行为(UB)。
使用va_arg(arguments, unsigned long);
得到一个unsigned long
。
使用va_arg(arguments, double);
得到一个double
。
*1高级:一些常见的传递机制可能存在于类型对,如int/unsigned
,但不适用于此处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.