首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >x86_64 va_list结构的格式是什么?

x86_64 va_list结构的格式是什么?
EN

Stack Overflow用户
提问于 2011-02-10 22:34:19
回答 2查看 17.8K关注 0票数 25

谁有在Linux(在x86_64上使用的那个)中表示va_list的参考资料?我正在尝试调试一些堆栈或参数似乎已损坏的代码,这将有助于理解我应该看到的内容……

EN

回答 2

Stack Overflow用户

发布于 2011-02-10 23:40:57

原来问题出在gcc把va_list变成了数组类型。我的函数是签名:

代码语言:javascript
复制
void foo(va_list ap);

我想把指向ap的指针传递给另一个函数,所以我这样做了:

代码语言:javascript
复制
void foo(va_list ap)
{
    bar(&ap);
}

不幸的是,在函数参数列表中,数组类型衰减为指针类型,所以我不是将指针传递给原始结构,而是将指针传递给指针。

为了解决此问题,我将代码更改为:

代码语言:javascript
复制
void foo(va_list ap)
{
    va_list ap2;
    va_copy(ap2, ap);
    bar(&ap2);
    va_end(ap2);
}

这是我能想到的唯一可移植的解决方案,它既考虑了va_list是数组类型的可能性,也考虑了它不是数组类型的可能性。

票数 19
EN

Stack Overflow用户

发布于 2018-09-17 00:35:35

在i386架构中,va_list是一种指针类型。但是,在AMD64体系结构中,它是一个数组类型。有什么关系?实际上,如果你对一个指针类型应用&操作,你会得到这个指针变量的地址。但是,无论您对一个数组类型应用多少次&操作,值都是相同的,并且等于这个数组的地址。

那么,你应该在AMD64中做什么呢?在函数中传递va_list变量的最简单方法是不带*或&运算符。

例如:

代码语言:javascript
复制
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
}

它真的很有效!你也不需要担心你有多少个论点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4958384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档