未知(内存损坏)错误.sprintf_s输出
Unknown (corrupt memory) error. sprintf_s output.c
#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传递给sprintf
的vsprint_s
版本。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- sprintf() 乱码输出
- 不同于c++中sprintf函数的输出
- Sprintf输出一个额外的字符串