簡體   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