具有较少数量参数的C函数在调用较少数量参数时返回意外输出

问题描述

我正在学习C,并且创建了一个简单的addNumbers(int num,...)函数,该函数接受任意数量的int参数,并返回它们的总和。

这个问题是当我得到addNumbers(4,2)输出时,输出14823901。显然是不正确的。

当我调用函数addNumbers(4,2,4,7,10)时,它输出23,这也是不正确的,因为它应该是27,但至少离它更近了。

这是我的代码

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

// Functions with variable number of arguments
int addNumbers(int num,...)
{
    int i;
    int sum = 0;

    // List to hold variable amount of parameters
    va_list parameters;

    // Initialize "parameters" list with arguments
    va_start(parameters,num);

    for(i = 0; i < num; i++)
    {
        // Adds each "int" argument from "parameters" to sum
        sum += va_arg(parameters,int);
    }

    // Cleans memory
    va_end(parameters);

    return sum;
}

int main()
{
    printf("%i",addNumbers(4,10));
    return 0;
}

我应该不使用va_listva_arg等吗?

能够接受可变数量的参数的最佳方法是什么?

解决方法

对于addNumber(4,2),您正在使用第一个参数作为计数器,其中有4个参数要累加,但您只给出1,因此for循环继续从内存中读取期望更多的参数,并选择随机值和加起来。