运行时检查失败#2 - 变量周围的堆栈已损坏

时间:2012-10-08 15:21:07

标签: c

我已经在stackoverflow上看到了一些问题但是没有一个能解决我的问题...

我在C中有代码:


#include <stdio.h>
#include <stdlib.h>

int main ()
{
    char str[] = "";
    scanf("%[^\n]", str);
    printf("Você digitou: %s\n", str);
    system("pause");
}

当我运行程序时,我遇到了错误:

运行时检查失败#2 - 变量'str'周围的堆栈已损坏。

现在,我真的不知道我在那里做错了什么...... :(

4 个答案:

答案 0 :(得分:6)

数组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(),但之后需要删除换行符。

答案 1 :(得分:2)

您不应该使用用户输入覆盖常量。将char str[] = ""替换为char * str = malloc(<enough bytes for any possible input),或者甚至了解更安全的API。

答案 2 :(得分:1)

您只需分配一个字节来存储输入。这条线

char str[] = "";

为字符串内容分配零字节,为其空终止符分配一个字节。相反,做一些像

这样的事情
char str[100];

或者无论最大输入长度是多少。

答案 3 :(得分:0)

这个答案适用于从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
}

我的直觉是propApropB只是私有属性,从此类外的代码中看不到。

问题原因是我没有将propApropB放在MyClass.h中。 当MyClass被调用者实例化时,编译器不知道它应该分配多少内存。

我只是将标题添加到标题MyClass.h

MyClass.h(已修复)

class MyClass {
    int64 propA, propB;

public:
    void work();

};