gpt4 book ai didi

c - va_arg 给出垃圾文本

转载 作者:太空狗 更新时间:2023-10-29 16:03:40 25 4
gpt4 key购买 nike

我做了一个简单的测试用例:

static void va_test(char* str_arg, ...)
{
va_list ap;
va_start(ap, str_arg);
for( ; ; ) {
if (str_arg == NULL)
break;
int n = va_arg(ap,int);
printf("arg: %s,%d\n", str_arg, n);
str_arg = va_arg(ap,char*);
}
va_end(ap);
printf("\n");
}

当我在独立的可执行文件中使用 va_test("beer",1,"cofe",2,"juice",3,0) 运行它时,它工作正常。但是当我从我的项目可执行文件中调用它时,它非常大,它会给出一些像这样的垃圾字符串:

arg: bear,1
arg: cofe,2
arg: juice,3
arg: ^X(garbage...),57

我猜肯定是调用这个函数之前发生了内存困惑,但是我该如何调试呢?

[编辑]我稍微更新了描述,因为严格来说,错误发生在我将超过 6 个参数传递给 va_test 时。我意识到前六个 64 位参数在 amd64 机器中通过寄存器传递,而其他参数通过堆栈传递。当 va_arg 尝试从 *overflow_arg_area 获取第一个 arg 时会出现问题。

最佳答案

对我来说最有可能的解释是,您所处的系统中 int 0 与 char * 0 具有不同的表示形式。这可以在一个 64 位系统,其中 sizeof(int) == 4sizeof(char *) == 8

尝试将最后一个参数作为 (char *) 0 而不是 0 传递,你应该没问题。所有其余代码在技术上看起来都是正确的。

关于c - va_arg 给出垃圾文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8132678/

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