谁有在Linux(在x86_64上使用的那个)中表示va_list
的参考资料?我正在尝试调试一些堆栈或参数似乎已损坏的代码,这将有助于理解我应该看到的内容……
发布于 2011-02-10 23:40:57
原来问题出在gcc把va_list
变成了数组类型。我的函数是签名:
void foo(va_list ap);
我想把指向ap
的指针传递给另一个函数,所以我这样做了:
void foo(va_list ap)
{
bar(&ap);
}
不幸的是,在函数参数列表中,数组类型衰减为指针类型,所以我不是将指针传递给原始结构,而是将指针传递给指针。
为了解决此问题,我将代码更改为:
void foo(va_list ap)
{
va_list ap2;
va_copy(ap2, ap);
bar(&ap2);
va_end(ap2);
}
这是我能想到的唯一可移植的解决方案,它既考虑了va_list
是数组类型的可能性,也考虑了它不是数组类型的可能性。
发布于 2018-09-17 00:35:35
在i386架构中,va_list是一种指针类型。但是,在AMD64体系结构中,它是一个数组类型。有什么关系?实际上,如果你对一个指针类型应用&操作,你会得到这个指针变量的地址。但是,无论您对一个数组类型应用多少次&操作,值都是相同的,并且等于这个数组的地址。
那么,你应该在AMD64中做什么呢?在函数中传递va_list变量的最简单方法是不带*或&运算符。
例如:
void foo(const char *fmt, ...) {
va_list ap;
int cnt;
va_start(ap, fmt);
bar(fmt, ap);
va_end(ap);
return cnt;
}
void bar(const char *fmt, va_list ap) {
va_arg(ap, int);
//do something
test(ap);
}
void test(va_list ap) {
va_arg(ap, int);
//do something
}
它真的很有效!你也不需要担心你有多少个论点。
https://stackoverflow.com/questions/4958384
复制相似问题