变量周围的堆栈损坏了

stack around the variable...was corrupted

本文关键字:损坏 坏了 堆栈 周围 变量      更新时间:2023-10-16

我有一个简单的函数,它将一些数据写入一个新文件。它工作,文件被写入,但我得到上述错误,而调试在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,它仍然会给我错误

出什么事了?

为什么将字符缓冲区的大小声明为20?很有可能sprintf放置的字符比myChar中容纳的字符多。

请使用

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

如果你按照"guess the biggest size for my array"Route,你最不应该做的就是倒数到最后一个字符,缓冲区的大小。

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

您的格式字符串也包含6个字面a字符,我们不应该忘记0结束符。

All in All: 2*8+6+1 = 23 > 20 !!

您的缓冲区必须至少有23字节大,除非有其他未公开的输入限制。

我个人认为应该是32。

另外,最好使用snprintf,并有选择地验证完整的字符串是否真正适合(如果不适合,您将得到一个缩短的字符串,所以没有灾难)。

char myChar [32];
snprintf(myChar, sizeof myChar, "aa%03daa%daa", i1, i2);

请注意,Microsoft的实现是不兼容的,并且不保证0终止。