堆栈变量...已损坏

stu*_*nt1 14 c++ stack printf

我有一个简单的函数,可以将一些数据写入新文件.它工作正常,文件已写入,但在MSVS Express 2013中调试时出现上述错误.

void writeSpecToFile(const char *fname); //in header file.

char myChar [20];
sprintf(myChar, "aa%03daa%daa", i1, i2);
const char* new_char = myChar;
writeSpecToFile(myChar);
Run Code Online (Sandbox Code Playgroud)

如图所示,我只是使用sprintf将一些变量插入到字符串中(工作正常).现在,无论我是通过myChar还是new_char,它仍然会给我带来损坏错误.

什么地方出了错?

Pau*_*zie 14

你为什么声明大小为20的字符缓冲区?更多可能sprintf放置的更多字符可以放在myChar中.

相反,使用

  1. 更安全的结构,如std :: ostringstream或
  2. 至少,声明你的char数组比你想象的要大得多(不是最好的方法,但至少不会发生错误).

如果您正在"猜测我的阵列的最大尺寸"路线,那么您要做的最后一件事就是尝试计算,直到最后一个字符,制作缓冲区有多大.如果你被一个字节关闭,那可能会导致崩溃.


Ded*_*tor 9

假设32位int,打印一个%d将产生最多8个可见字符.

您的format-string还包含6个文字字符a,我们不应该忘记0-terminator.

总而言之:2*8+6+1 = 23 > 20!!

除非存在其他未公开的输入限制,否则您的缓冲区必须至少为23字节大.

就个人而言,我会给它一轮32.

此外,更好地使用snprintf和可选地验证完整的字符串确实适合(如果它不适合你得到一个缩短的字符串,所以没有灾难).

char myChar [32];
snprintf(myChar, sizeof myChar, "aa%03daa%daa", i1, i2);
Run Code Online (Sandbox Code Playgroud)

请注意,Microsoft实现不符合要求,并且不保证0终止.

  • 同意这篇文章中的*everything*,但会指出`snprintf`等在MSVC上有奇怪的"非标准"行为.仔细阅读文档以确保您了解其工作原理,并确保您的代码处理丑陋的平台特定差异(如果您的目标是多个平台). (2认同)