MSDN示出了該示例代碼段爲vsnprintf_s
:在vsnprintf_s調用之後是否需要va_end?
// crt_vsnprintf_s.cpp #include <stdio.h> #include <wtypes.h> void FormatOutput(LPCSTR formatstring, ...) { int nSize = 0; char buff[10]; memset(buff, 0, sizeof(buff)); va_list args; va_start(args, formatstring); nSize = vsnprintf_s(buff, _countof(buff), _TRUNCATE, formatstring, args); printf("nSize: %d, buff: %s\n", nSize, buff); } int main() { FormatOutput("%s %s", "Hi", "there"); FormatOutput("%s %s", "Hi", "there!"); FormatOutput("%s %s", "Hi", "there!!"); }
在此示例中,va_start
稱爲而不一個匹配va_end
。
這是在MSDN一個文檔bug,或者我們應該叫va_start
之前調用vsnprintf_s
,然後讓這個功能做清除(即調用va_end
)我們呢?
BTW:我想上面的代碼和它的工作原理與VS2015與Update 3,但我不知道這是否只是不確定的行爲...
一個文檔錯誤,通過溜因爲va_end'的'的MS實現不會做所有的東西,而忽略它是「無害」。 'va_end'的存在是因爲一些平臺(不是x86)需要它來避免完全摧毀堆棧。 –