堆栈变量...已损坏

时间:2014-08-09 22:32:22

标签: 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);

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

出了什么问题?

2 个答案:

答案 0 :(得分:14)

为什么要声明大小为20的字符缓冲区?很可能sprintf放置了比myChar更多的字符。

相反,请使用

  1. 更安全的构造,例如std :: ostringstream或
  2. 至少,声明你的char数组比你想象的要大得多(不是最好的方法,但至少不会发生错误)。
  3. 如果您正在“猜测我阵列的最大尺寸”     路线,你要做的最后一件事是尝试计算,向下     到最后一个字符,缓冲区有多大。如果你被一个字节关闭,那可能会导致崩溃。

答案 1 :(得分: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);

请注意the Microsoft implementation不符合要求且不保证0终止。