未知(损坏的内存)错误。 sprintf_s output.c

时间:2013-08-12 09:54:28

标签: c++ c visual-c++ dll macros

#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"%d\t%ws(0x%08X, 0x%08X, %i, \"%ws\")\0", (2, L"a", 4, 4, 4, L"a"));
    DebugPrint(L"%d\t%s(0x%08X, 0x%08X, %i, \"%s\")\0", (2, "a", 4, 4, 4, "a"));

    ...

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

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

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

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

非常感谢。

我正在使用Visual C ++ 2008。

P.S。代码是不同的(我通常不会考虑使用sprint_s(...,“%ws”,x)但是那个也导致了错误。我希望这段代码没问题,我就是不能想一想。非常感谢。

2 个答案:

答案 0 :(得分:2)

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

#define PRINT(x,y) sprintf(x,y)

PRINT( "%s %d", ("hello",42) );

扩展为sprintf( "%s %d", ("hello",42) ),因此你有一个逗号运算符,只有一个参数传递给sprintf()。使用variadoc宏可以解决这个问题。

答案 1 :(得分:2)

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

逗号运算符评估它的两边并产生右侧。 你有多个逗号,所以那里的总表达式产生L"a"。 摆脱封闭的(),一切都会好的。

编辑后的

:我建议摆脱定义并使用( ,... )使其成为常规函数并使用varargs并将该varargs传递给vsprint_ssprintf }。