运行时检查失败 #2 - 变量周围的堆栈已损坏
Posted
技术标签:
【中文标题】运行时检查失败 #2 - 变量周围的堆栈已损坏【英文标题】:Run-Time Check Failure #2 - Stack around the variable was corrupted 【发布时间】:2012-10-08 15:21:06 【问题描述】:我已经在 *** 看到了一些问题,但没有一个问题能解决我的问题...
我在 C 中有该代码:
#include <stdio.h>
#include <stdlib.h>
int main ()
char str[] = "";
scanf("%[^\n]", str);
printf("Você digitou: %s\n", str);
system("pause");
当我运行程序时,我遇到了错误:
运行时检查失败 #2 - 变量“str”周围的堆栈已损坏。
现在,我真的不知道我在那里做错了什么...... :(
【问题讨论】:
【参考方案1】:数组str
在初始化的情况下只能保存一个char
。对scanf()
的调用将覆盖str
的边界,从而导致未定义的行为,在这种情况下会破坏堆栈。您需要确定str
数组的大小并限制读取的字符数以防止缓冲区溢出。
要使用scanf()
,请指定要读取的最大字符数:
char str[1024];
if (1 == scanf("%1023[^\n]", str)) /* Check return value to ensure */
/* 'str' populated. */
/* Specify one less than 'str' */
/* size to leave space for null.*/
您也可以使用fgets()
,但之后需要删除换行符。
【讨论】:
【参考方案2】:您不应该用用户输入覆盖常量。将char str[] = ""
替换为char * str = malloc(<enough bytes for any possible input)
,甚至了解更安全的API。
【讨论】:
【参考方案3】:您只分配一个字节来存储输入。线
char str[] = "";
为字符串内容分配零字节,为其空终止符分配一个字节。相反,做类似的事情
char str[100];
或任何最大输入长度。
【讨论】:
【参考方案4】:此答案适用于所有从 Java/C# 或其他现代面向对象语言转向 C++ 的人。
对我来说,这个问题发生的原因如下:
我创建了自己的自定义 C++ 类。
MyClass.h
class MyClass
public:
void work();
;
MyClass.cpp
#include "MyClass.h"
#include <iostream>
class MyClass
int64 propA, propB;
public:
void work();
;
void MyClass::work()
// some work that uses propA and propB
我的直觉是 propA
和 propB
将只是私有属性,在此类之外的代码中是不可见的。
问题原来是我没有把propA
和propB
放在MyClass.h
里。
当MyClass
被调用者实例化时,编译器不知道它应该分配多少内存。
我只是将属性添加到标题MyClass.h
:
MyClass.h(固定)
class MyClass
int64 propA, propB;
public:
void work();
;
【讨论】:
以上是关于运行时检查失败 #2 - 变量周围的堆栈已损坏的主要内容,如果未能解决你的问题,请参考以下文章