2012-10-08 91 views
5

我已经看到了一些问题,在这里计算器,但它们都没有解决我的问题......运行时检查失败#2 - 围绕堆栈变量被损坏

我在C代码:


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

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

当我运行该程序,我有错误:

运行时检查失败#2 - 堆栈围绕variabl e'str'被破坏了。

现在,我真的不知道我在做什么不对劲的地方... :(

回答

5

阵列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 = malloc(<enough bytes for any possible input)更换char str[] = ""甚至了解更安全的API。

1

你只分配一个字节来存储输入。该行

char str[] = ""; 

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

char str[100]; 

或无论最大输入长度将。

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(); 

}; 
相关问题