繁体   English   中英

为什么这个可变的 function 代码在每次运行时都会产生随机结果?

[英]Why does this variadic function code produce random results on every run?

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

由于doubleunsigned 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM