sprintf挣扎......有点蠢吗?

时间:2011-04-12 15:44:37

标签: c++ c printf

很抱歉让每个人都讨厌,但这给我带来了一些痛苦。这是代码:

char buf[500];
sprintf(buf,"D:\\Important\\Calibration\\Results\\model_%i.xml",mEstimatingModelID);

mEstimatingModelID是一个整数,当前保持值为0。

很简单,但调试显示正在发生这种情况:

0x0795f630 "n\Results\model_0.xml"

即。它缺少字符串的开头。

有什么想法吗?这很简单,但我无法弄清楚。

谢谢!

1 个答案:

答案 0 :(得分:3)

努力使其成为一个实际的一般答案:以下是类似错误的清单:

  • 永远不要相信您在发布模式下看到的内容,尤其是从堆栈内存中分配的局部变量。堆数据中存在的静态变量是唯一通常是正确的,但即便如此,也不要相信它。 (以上用户的情况如此) 根据我的经验,VS的最新版本具有不太可靠的发布模式数据(可能b / c它们在发布时优化得更多,或者可能是64位或其他)

  • 始终确认您正在检查正确函数中的变量。在更高的函数中有一个名为“buf”的变量很容易,其中包含一些未初始化的垃圾。这很容易与下部子程序/函数中的相同命名变量混淆。

  • 仔细检查缓冲区溢出始终是个好主意。如果您在sprintf中使用%s,则可能获得缓冲区溢出。

  • 检查您的类型。 sprintf具有很强的适应性,当你想要一个int时,你可以通过传入一个字符串指针轻松获得一个非崩溃但奇怪的结果。