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

Jac*_*ack 5 c c++ printf

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

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

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

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

0x0795f630 "n\Results\model_0.xml"
Run Code Online (Sandbox Code Playgroud)

即它缺少字符串的开头.

有任何想法吗?这很简单,但我无法弄清楚.

谢谢!

Dav*_*kel 3

为了使这成为一个实际的一般答案:这是类似错误的清单:

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

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

  • 仔细检查缓冲区溢出总是一个好主意。如果您在 sprintf 中使用过 %s,则可能会出现缓冲区溢出。

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