未知(内存损坏)错误.sprintf_s输出

Unknown (corrupt memory) error. sprintf_s output.c

本文关键字:sprintf 输出 错误 内存 损坏 未知      更新时间:2023-10-16
#define DebugPrint(x, y) 
{ 
    char *MACROmsg; 
    char *MACROprint; 
    MACROmsg = (char *) malloc (1056); 
    MACROprint = (char *) malloc (1056); 
    sprintf_s(MACROmsg, 1056, "%ws", x); 
    sprintf_s(MACROprint, 1056, MACROmsg, y); 
    MessageBox(NULL, MACROprint, NULL, NULL); 
    if(MACROprint) free(MACROprint); 
    if(MACROmsg) free(MACROmsg); 
}
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    BOOL bRtn;
    DebugPrint(L"%dt%ws(0x%08X, 0x%08X, %i, "%ws")", (2, L"a", 4, 4, 4, L"a"));
    DebugPrint(L"%dt%s(0x%08X, 0x%08X, %i, "%s")", (2, "a", 4, 4, 4, "a"));
    ...

你好。我很抱歉因为沮丧而问了一个问题,但我已经浏览了我的代码并将其更改为以此开头。第一行执行正常,第二行执行不正常。它看起来是因为第二个%s在output.c(Microsoft的sprintf代码(中存在问题。指针变为空。我会认为他们的代码是完美的,错误在于我的,但我看不到它。

非常怀疑我是否设法更改了该文件的代码,并在它被锁定时意外地重新编译了它,我会有一条消息警告我。

DLL 正在从 C++ .net 应用程序调用。我也无法想象这里的错误。

我有几个全局变量,如果初始化,它们只会初始化为 NULL。它们未被引用。至少可以说我很沮丧,我不知道还能去哪里看。也许有人遇到过类似的事情,或者想过问题可能是什么,甚至可能是什么。

非常感谢。

我正在使用Visual C++ 2008。

附言代码是不同的(我通常不会考虑使用 sprint_s(..., "%ws", x(,但那个也会导致错误。我希望这段代码没问题,我只是想不通。非常感谢。

假设DebugPrint()PrintData()相同,我认为您的问题是x中的括号将成为评估宏的一部分。我检查了一个简单的例子:

#define PRINT(x,y) sprintf(x,y)
PRINT( "%s %d", ("hello",42) );

这扩展到sprintf( "%s %d", ("hello",42) ),所以你有一个逗号运算符,只有一个参数传递得如此sprintf()。使用可变宏应该可以解决这个问题。

(2, L"a", 4, 4, 4, L"a")是一个带有逗号运算符的表达式。

逗号运算符计算它的两侧并生成右侧。您有多个逗号,因此那里的总表达式产生L"a"。摆脱封闭(),一切都会好起来的。

编辑后:我建议摆脱定义并使其成为具有( ,... )的常规函数并使用varargs并将该varargs传递给sprintfvsprint_s版本。