我遇到了问题。 例如:
try
{
char strMes[6];
sprintf_s(strMes, sizeof(strMes), "%s", "012345678");
printf(strMes);
}
catch(...)
{
printf("Wrong\n");
}
在调试环境中,它导致调试器“缓冲区太小”消息。
在发布环境中导致崩溃。
我尝试将try-catch块替换为__try -__,除了(EXCEPTION_EXECUTE_HANDLER)块,但我得到了相同的行为。
我有大约1K的sprintf_s函数调用,所以将sprintf_s替换为_snprintf_s不是我的选择。 (见sprintf_s with a buffer too small)
请帮忙!
答案 0 :(得分:5)
首先,我认为你应该使用snprintf
代替sprintf_s
。
其次,CRT有invalid paramater handler被调用。尝试设置。
答案 1 :(得分:1)
您必须检查sprintf_s
的返回值,然后再使用strMes
。否则你怎么知道缓冲区是否足够大?
sprinft_s
可能没有写入strMes
,因此它仍然未初始化。这就是导致崩溃的原因(尝试删除sprintf_s
,它也可能崩溃。)
来自sprintf_s
文档:
写入的字符数,如果发生错误,则返回-1。如果 buffer或format是空指针,sprintf_s和swprintf_s返回-1 并将errno设置为EINVAL。
PS:你应该用try / catch标记这个问题C ++而不是C.
答案 2 :(得分:1)
答案 3 :(得分:0)
如果您的VS版本支持,则应对其运行代码分析。