奇怪的行为省略号函数(va_list)

时间:2016-12-28 02:21:44

标签: c variadic-functions ellipsis

以下max函数应该返回5,但它返回4294967294。我怀疑这种奇怪的行为是由于铸造变量引起的,但却无法弄清楚。有人可以检测到故障吗?

系统:Windows 7(64位),mingw64

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdarg.h>
#include <inttypes.h>

int64_t max(int64_t n, ...) {
    va_list v;
    int64_t i, t, max = INT64_MIN;

    va_start(v, n);

    for (i = 0; i < n; i++) {
        t = va_arg(v, int64_t);

        if (max < t) {
            max = t;
        }
    }

    va_end(v);
    return (max);
}

int main(int argc, char **argv) {
    printf("max(3, 1, 5, -2)   : %3I64d\n", max(3, 1, 5, -2));
    return (0);
}

1 个答案:

答案 0 :(得分:6)

编译器不知道1,5和-2应该是int64_t类型。因此它会将它们视为普通的int,并且只会在堆栈上使用那么多空间。

然后,您将其视为int64_t,其肯定大于int,因此您的输入和var_args不一致。

一种修复方法,在通话网站上投放到int64_t

printf("max(3, 1, 5, -2)   : %"PRId64"\n", max(3, (int64_t)1, (int64_t)5, (int64_t)-2));

您显然也可以明确传递int64_t类型的变量。