变异函数

2 c variadic-functions

#include <stdarg.h>
#include <stdio.h>

void varfun(int n,...){
va_list ptr;
int num;
va_start(ptr,n);
num=va_arg(ptr,int);
printf("\n%d",num);

}


int main(int argc, char **argv){

varfun(3,7.5,-11.2,0.66);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

看看上面的代码,我希望输出是第一个输入到int的变量参数值,即7.5输入到int,即7.但输出为0.这有什么问题?

pmg*_*pmg 8

va_arg转换参数.它将其解释为指示的类型.如果类型不匹配,则调用Undefined Behavior.

va_arg(ptr, int); /* take the next 4 bytes from the stack and interpret them as an `int` */
va_arg(ptr, double); /* take the next 8(?) bytes ... and interpret as double */
(int)va_arg(ptr, double); /* ... convert to int */
Run Code Online (Sandbox Code Playgroud)

另请注意,您的代码段中并不真正需要强制转换.编译器将自动转换

void varfun(int n, ...) {
    va_list ptr;
    int num;
    va_start(ptr, n);
    num = va_arg(ptr, double); /* interpret as double, then convert to int */
    printf("%d\n",num);
}
Run Code Online (Sandbox Code Playgroud)