变量周围的堆栈损坏了
stack around the variable...was corrupted
我有一个简单的函数,它将一些数据写入一个新文件。它工作,文件被写入,但我得到上述错误,而调试在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中容纳的字符多。
请使用
- 更安全的结构,如std::ostringstream或
- 至少声明了比预期大得多的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终止。
相关文章:
- wxWidgets mac剪贴板在3.1.3上坏了?
- 计时器坏了或者其他什么的
- 调用delete[]时,某些东西导致堆损坏,但我已正确设置了数组的维度
- boost::p rocess::env 在 ubuntu 19.04 上坏了?
- std::regex 是否保证了最坏情况下的时间复杂度?
- 课堂上的一行,使整个应用程序坏了. 0xC000005错误
- 向量元素数据损坏了Find()操作
- 为什么我的作业操作员给出了损坏错误
- Boost 的数据驱动测试的联接运算符"+"损坏了第一列
- 为什么我的输出损坏了
- SFML sf::Text::setFillColor 坏了,还是我做错了什么
- glibc 损坏了 RHEL 5 中的双链表
- 包含链接列表的链接列表给出了堆的损坏错误:原因
- 网关函数损坏了从matlab到c++mex程序的输入
- 开关内的案例不停地循环,即使我坏了
- 堆损坏/坏分配问题立即在主
- 溪水变坏了
- 我最基本的c++程序坏了,我不知道为什么
- 我的电脑怎么坏了?
- 条件评估是否优化?这个代码坏了吗