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

C++ 未知(内存损坏)错误。sprintf_s output.c,c++,c,visual-c++,dll,macros,C++,C,Visual C++,Dll,Macros,你好。我很抱歉因为沮丧而问了一个问题,但我已经浏览了我的代码,并将其更改为从这个开始。第一行执行得很好,第二行执行得不好。第二个%s在output.c(Microsoft的sprintf代码)中出现问题。指针变为空。我会认为他们的代码是完美的,错误是我的,但我看不到。< /P> 我非常怀疑我是否已设法更改了该文件的代码,并意外地重新编译了它,因为它已被锁定,我将收到一条消息警告我 DLL是从C++ .NET应用程序调用的。我也无法想象这里有什么错 我有几个全局变量,如果初始化,它们只初始化为N

你好。我很抱歉因为沮丧而问了一个问题,但我已经浏览了我的代码,并将其更改为从这个开始。第一行执行得很好,第二行执行得不好。第二个%s在output.c(Microsoft的sprintf代码)中出现问题。指针变为空。我会认为他们的代码是完美的,错误是我的,但我看不到。< /P> 我非常怀疑我是否已设法更改了该文件的代码,并意外地重新编译了它,因为它已被锁定,我将收到一条消息警告我

DLL是从C++ .NET应用程序调用的。我也无法想象这里有什么错

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

非常感谢

我使用Visual C++ 2008。< /P>


p、 代码是不同的(我通常不会考虑使用sprint_s(…,“%ws”,x),但这一个也会导致错误。我希望这段代码不会有问题,我只是无法理解。非常感谢。

假设
DebugPrint()
PrintData()
都是相同的,我认为您的问题在于
x
中的括号将是已计算宏的一部分。我检查了一个简单的示例:

#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"));

    ...

扩展到sprintf(“%s%d”(“hello”,42)),因此您有一个逗号运算符,并且只传递了一个参数,所以
sprintf()
。使用variadoc宏应该可以解决这个问题。

假设
DebugPrint()
PrintData()
都是相同的,我认为您的问题在于
x
中的括号将是已计算宏的一部分。我检查了一个简单的示例:

#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"));

    ...
扩展到sprintf(“%s%d”(“hello”,42)),因此您有一个逗号运算符,并且只传递了一个参数,所以
sprintf()
。使用variadoc宏应该可以解决这个问题。

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

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

编辑后:我建议去掉define,使用
(,…)
使其成为常规函数,使用
varargs
,并将该varargs传递给
vsprint\u s
版本的
sprintf
(2,L“a”,4,4,L“a”)
是一个带有逗号运算符的表达式

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


编辑后:我建议去掉define,使用
(,…)
使其成为常规函数,使用
varargs
并将该varargs传递给
vsprint\s
版本的
sprintf

,我建议这样做是因为括号中的参数和宏中的参数只推动最后一个参数(请参阅逗号运算符)。尝试使用可变宏()或内联函数。我认为
PrintData
可能是
DebugPrint
,但是代码重构有一个输入错误?在宏
DebugPrint
中,您可能应该检查
malloc()
是否没有返回
NULL
,这是答案谢谢。:)malloc正在通过调试器进行检查。一个函数正在替换sprintf,但谢谢。:)我建议发生这种情况,因为括号和宏中的参数仅用于printf的最后一个参数(请参阅逗号运算符)。尝试使用变量宏()或内联函数。我认为
PrintData
可能是
DebugPrint
,但是代码重构会有打字错误吗?在宏
DebugPrint
中,您可能应该检查
malloc()
是否未返回
NULL
,这就是答案谢谢。)正在通过调试器检查malloc()。一个函数正在替换sprintf,但非常感谢。:)这似乎很管用。谢谢你。我想您不知道为什么vswprintf__s不将字符串转换为宽字符串?(vswprintf_s(v,20,L“%s”,“abc”);)在宽字符串函数中打印非宽字符串时,我得到的是“abc”而不是“a\0b\0c\0”,使用的是%s而不是%s。例如无符号字符*str;str=“abc”;wprintf(“%S”,str);与printf相同(“%s”,str);反之亦然。这似乎效果很好。谢谢你。我想您不知道为什么vswprintf__s不将字符串转换为宽字符串?(vswprintf_s(v,20,L“%s”,“abc”);)在宽字符串函数中打印非宽字符串时,我得到的是“abc”而不是“a\0b\0c\0”,使用的是%s而不是%s。例如无符号字符*str;str=“abc”;wprintf(“%S”,str);与printf相同(“%s”,str);事实上,它被传递给了一个函数,而不是sprintf,但我想看看并找到问题的确切位置。这是一条简单的捷径不过谢谢你。:)它实际上是传递给一个函数而不是sprintf,但我想看看并找到问题的确切位置。这是一条简单的捷径不过谢谢你。:)