C语言 为什么这个变元函数代码每次运行都产生随机结果?

nbysray5  于 2023-01-29  发布在  其他
关注(0)|答案(1)|浏览(130)

由于doubleunsigned 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);
}
ibps3vxo

ibps3vxo1#

由于doubleunsigned long大小相同,va_arg应从堆栈中弹出相同数量的字节...
没有。
不同类型的参数传递机制不会被C指定为相同,也不会来自 stack。*1
OP的代码具有 * 未定义的行为 *(UB)。

  • 使用va_arg(arguments, unsigned long);得到一个unsigned long
  • 使用va_arg(arguments, double);得到一个double
  • 1高级:对于int/unsigned这样的类型对,* 可能 * 存在一些常见的传递机制,但在这里不适用。

相关问题