我有一个可以正常工作的实用程序 C 函数:
void UtilDisplayMessage(char* strCaption, char* strMessageFormat, int iArgCount, ...)
{
// Initialize the variable arg list
va_list lstArgs;
va_start(lstArgs, iArgCount);
// Format the message
vsprintf_s(g_strMessage, UTIL_DEF_MESSAGE_SIZE, strMessageFormat, lstArgs);
// Destroy the variable arg list
va_end(lstArgs);
// Use formatted string here...
}
但我想删除“iArgCount”参数,所以我做了一个如下所示的测试函数:
void UtilDisplayMessageEasy(char* strCaption, char* strMessageFormat, ...)
{
// Initialize the variable arg list
va_list lstArgs;
int iParamCount = 1;
va_start(lstArgs, iParamCount);
// Format the message
vsprintf_s(g_strMessage, UTIL_DEF_MESSAGE_SIZE, strMessageFormat, lstArgs);
// Destroy the variable arg list
va_end(lstArgs);
// Use formatted string here...
}
但是如果我通过这个调用传入一个整数值,我会得到虚假的结果:
UtilDisplayMessageEasy("TEST", "The value is %i.", 1);
当我通过这个调用传入一个字符串时,我得到一个访问冲突异常:
UtilDisplayMessageEasy("TEST", "This is only a %s.", "TEST");
然而,如果我像这样调用我的原始函数,它工作正常:
UtilDisplayMessage("TEST", "This is only a %s.", 1, "TEST");
我是否将参数参数或本地参数传递给 va_start() 真的有这么根本的区别吗?
另外我知道可变参数不是很安全,应该小心使用,但这种无害的东西肯定不应该让警报响起。
感谢您对此问题的任何意见。