我有一个简单的函数,可以将一些数据写入新文件.它工作正常,文件已写入,但在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中.
相反,使用
如果您正在"猜测我的阵列的最大尺寸"路线,那么您要做的最后一件事就是尝试计算,直到最后一个字符,制作缓冲区有多大.如果你被一个字节关闭,那可能会导致崩溃.
假设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终止.