由于double
和unsigned long
的大小相同,va_arg
应该从堆栈中弹出相同数量的字节,并且每次运行程序时显示的值应该相同,因为double
的值没有改变,但事实并非如此,显示的值在相邻的存储单元中找不到。
在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);
}
1条答案
按热度按时间ibps3vxo1#
由于
double
和unsigned long
大小相同,va_arg
应从堆栈中弹出相同数量的字节...没有。
不同类型的参数传递机制不会被C指定为相同,也不会来自 stack。*1
OP的代码具有 * 未定义的行为 *(UB)。
va_arg(arguments, unsigned long);
得到一个unsigned long
。va_arg(arguments, double);
得到一个double
。int/unsigned
这样的类型对,* 可能 * 存在一些常见的传递机制,但在这里不适用。