C函数变量参数长度

时间:2015-04-22 17:11:34

标签: c

我想将变量参数传递给函数但不想在参数中设置数字。所以我用0检查参数的结尾如下:

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

void foo(char* str, ... )
{
    printf("str: %s\n",str);
    va_list arguments;                     
    va_start(arguments,str);
    while(1) {
        double data = va_arg(arguments,double); 
        if (data == 0) {
            break;
        }
        printf("data: %.2f\n",data);
    }
    va_end (arguments);
    return;
}

int main()
{
    foo("hello", 5.5, 4.5, 3.5);
}

但看起来似乎不正确:

str: hello
data: 5.50
data: 4.50
data: 3.50
data: 34498135662005122837381407988349324615424289861359674446209831441373336786008345008385190019649501215393603210517859097842586295826918562939434091794406737728862534747430060032.00

最后一个数据输出是随机值,它应该不存在!

2 个答案:

答案 0 :(得分:4)

您可以通过向传递的值添加sentinel值来解决此问题。

int main()
{
    foo("hello", 5.5, 4.5, 3.5, 0.0);
}

我的测试中必须0.0,而不是0

答案 1 :(得分:3)

当您调用该函数时,您不会提供0.0参数。该函数尝试将所有内容打印到零参数,但没有这样的参数。

该函数将继续查看内存,它会指望第5个,第6个......参数,直到一个这样的位置随机包含零或程序崩溃。