gpt4 book ai didi

c - 为什么这个 GNU C 可变参数函数会返回一个巨大的数字?

转载 作者:太空宇宙 更新时间:2023-11-04 06:18:03 25 4
gpt4 key购买 nike

我正在查看 this example C 中的可变参数函数,编写于 GNU.org。我的操作系统是 Debian 8.6。

这是我对它的细微改动,文件名是 ex.c:

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

int addEmUp(int count,...){
va_list ap; // where list of arguments are stored
int i, sum;

va_start(ap,count); // initialize the argument list

sum= 0;
for(i=0; i<count; i++)
sum += va_arg(ap,int); // get the next argument value

va_end(ap); // clean up

return sum;
}

int main(void){
printf("%d\n", addEmUp(3,4,5,6));
printf("%d\n", addEmUp(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
printf("%d\n", addEmUp(10,10,10,10));
return 0;
}

这是我的生成文件 _example.mak:

CFLAGS=-Wall -g
CFILE=ex

run:
cc $(CFILE).c -o $(CFILE) $(CFLAGS)
./$(CFILE)
rm -f $(CFILE)

当我打开终端并运行 make -f _example.mak 时的输出:

./ex
15
55
1141373223
rm -f ex

为什么第三个 addEmUp() 打印 1141373223

最佳答案

你有未定义的行为。

您将 10 作为第一个参数发送,但您调用 addEmUp() 时仅使用了 3 个附加参数。

printf("%d\n", addEmUp(3, 10, 10, 10));

当你有一个未定义的行为时,你无法知道会发生什么。当您的函数 addEmUp() 使用 va_arg() 时。你可以引起很多思考:

  • 段错误
  • 错误的行为(你得到的)
  • 等等

喜欢@user3553031 在评论中说:

Most likely, those other numbers that you're adding into sum are whatever else is on the call stack -- things like the saved return address and possibly even the current value of sum itself. This is strongly dependent on your operating system, compiler, and machine architecture; C does not define the structure of the call stack or even require that one exists.

关于c - 为什么这个 GNU C 可变参数函数会返回一个巨大的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253660/

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