奇怪的省略号函数 (va_list)
Weird behaving ellipsis function (va_list)
下面的 max
函数应该 return 5 但它 returns 4294967294 而不是。我怀疑奇怪的行为是由变量转换引起的,但无法弄清楚。有人能检测出故障吗?
系统:Windows7(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,5 和 -2 应该是 int64_t
类型。所以它会将它们视为普通整数,并且只会在堆栈上为它们使用那么多 space。
然后您将它们读作 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
类型变量。
下面的 max
函数应该 return 5 但它 returns 4294967294 而不是。我怀疑奇怪的行为是由变量转换引起的,但无法弄清楚。有人能检测出故障吗?
系统:Windows7(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,5 和 -2 应该是 int64_t
类型。所以它会将它们视为普通整数,并且只会在堆栈上为它们使用那么多 space。
然后您将它们读作 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
类型变量。