繁体   English   中英

按值传递va_list时访问冲突

[英]Access violation when passing a va_list by value

我通过值将va_list参数从一个成员函数传递到另一个成员函数时出现访问冲突错误(使用Microsoft Visual C ++ 2005)。 如果我通过引用传递它一切都按预期工作但va_list不应该通过引用传递,是吗?

class A
{
public:
    char * getformatted( char const * a_format, ... )
    {
        va_list argp;
        va_start( argp, a_format );
        char * result = getformatted( a_format, argp );
        va_end( argp );
        return result;
    }
    char * getformatted( char const * a_format, va_list /*&*/ a_args )
    {
        static char buffer[ 256 ];
        int length = vsprintf( buffer, a_format, a_args );  // Access violation.
        return buffer;
    }
};

int main( int argc, char * argv[] )
{
    char * str = A().getformatted( "foo%s", "bar" );
    return 0;
}

<stdarg.h>

typedef char * va_list

所以A().getformatted( "foo%s", "bar" )调用A::getformatted( char const * a_format, va_list /*&*/ a_args)因为C字符串文字由于C兼容性而衰减为char *

如果单步执行,是否按预期顺序调用了两个函数?

所显示的两个功能都具有相似的签名,因此首先要检查是否确保呼叫正常进行。 这一点特别重要,因为va_list通常是char *的typedef,所以getformatted("foo%s", "bar")可以很好地调用,而不getformatted(const char *, ...)调用getformatted(const char *, ...)

如果是这种情况,并且vsprintf在任何时候使用va_next ,则行为将是未定义的。 有些编译器将va_函数作为简单宏处理,而其他编译器则具有重要功能。

通常,为解决此问题,带有va_list的函数将以v vsprintfvsprintf等),以消除任何潜在的歧义。

在最好的情况下,由于您使用的是C ++,因此通常首选std::stringstreamboost::format 两者都会为您提供类型安全性并防止大多数类似情况,而后者保留了printf的大部分语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM