[英]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.