簡體   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