C++ 为什么_stprintf_s会覆盖其他变量,但_stprintf不会覆盖?

C++ 为什么_stprintf_s会覆盖其他变量,但_stprintf不会覆盖?,c++,winapi,printf,malloc,C++,Winapi,Printf,Malloc,我正在使用visual studio进行win32编程课程。我在内存中分配了一个声明为TCHAR**bufTh的字符串全局数组,如 bufTh = (TCHAR**)malloc(nOfTh*sizeof(TCHAR*)); for (i = 0; i < nOfTh; i++) bufTh[i] = (TCHAR*)malloc(BUF_LEN*sizeof(TCHAR)); 在我的跑步中,信号量也会被值0xfefe覆盖 这是一个“神奇值”,它由安全CRT函数(如_stprin

我正在使用visual studio进行win32编程课程。我在内存中分配了一个声明为
TCHAR**bufTh
的字符串全局数组,如

bufTh = (TCHAR**)malloc(nOfTh*sizeof(TCHAR*));
for (i = 0; i < nOfTh; i++)
    bufTh[i] = (TCHAR*)malloc(BUF_LEN*sizeof(TCHAR));
在我的跑步中,信号量也会被值0xfefe覆盖

这是一个“神奇值”,它由安全CRT函数(如_stprintf_s)编写,以帮助您调试传递的缓冲区长度中的错误。这些函数的调试构建使用0xfe作为填充值填充整个缓冲区

   _stprintf_s(bufTh[i], BUF_LEN, ...));
因此,您知道thBuf[0]的缓冲区大小是而不是实际上是BUF_LEN。换句话说,malloc()调用是不正确的

   #define BUF_LEN _MAX_PATH+1
这是一个邪恶的宏,并导致您的问题。它扩展到

   bufTh[i] = (TCHAR*)malloc(_MAX_PATH + 1*sizeof(TCHAR));
当然不是你的意思。修正:

   #define BUF_LEN (_MAX_PATH+1)

额外的括号很重要。否则,就有充分的理由开始使用
const
关键字。

请显示更多代码。哪些部分可能相关?我想我展示的是一个最低限度的工作示例,你写了“其他变量”?这些变量位于哪里?你正在写关于线程的文章,也许你的代码根本就不是线程安全的。请在这里显示一个mcve。这个语句很可能没有什么问题,但修改它会重新调整代码/数据,以便揭示或隐藏不同错误造成的损害。我在谷歌上搜索了0xFEFE,但没有找到相关结果。有没有参考资料可以让我进一步了解这些“神奇的价值观”?不管怎样,谢谢。我刚刚创建了一个参考。好吧,只有当用户认为它有用时,它才起作用。
   #define BUF_LEN (_MAX_PATH+1)