gpt4 book ai didi

c - 行为怪异的省略号函数 (va_list)

转载 作者:行者123 更新时间:2023-12-02 08:16:40 24 4
gpt4 key购买 nike

下面的 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,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 类型的变量。

关于c - 行为怪异的省略号函数 (va_list),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41354528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com