下面的代码以错误结束,编译器指向fprintf(f,szBuffer)。猜猜这是由于内存分配造成的。它有什么问题?
int maxl = 1000000;
szBuffer = (char*)malloc(maxl);
if (sock.GetMail(szBuffer, maxl))
{
FILE* f = fopen("testfile.txt", "wt");
if (f)
{
fprintf(f, szBuffer);
fclose(f);
sock.DeleteMail();
}
else
{
LogEvent("[%s] [ERROR] Cannot create file %s", m_szInstanceName, szFileName);
}
}
free(szBuffer);
答案 0 :(得分:0)
永远不要让格式字符串动态/可访问/可更改,即使它很简单。
如果(在这种情况下)您的文字包含潜在的格式标记(如%s
),则会导致错误。还要确保字符串空值正确终止。
而是使用其他替代方法或添加虚拟格式字符串:
fprintf(f, "%s", szBuffer);
这实际上可能是崩溃的原因,但如果不知道邮件的内容,我们就不能肯定地说。
另外 - 正如Ed在评论中所提到的 - 你不应该在C ++程序中使用malloc()
和free()
。请改用new
和delete
,因为这些将在必要时正确调用构造函数/析构函数(对于char
数组并不重要,但它仍然不是很整洁。)
答案 1 :(得分:0)
你需要检查malloc的返回值,它可以是NULL。
你也应该使用下面的fprintf
fprintf(f,"%s",szBuffer);
这是因为szBuffer可能有任何格式字符串(如%d,%s等),在这里你使用szBuffer作为格式字符串(第二个参数)。