在我的程序中导致错误“堆栈变量''被破坏的原因”

时间:2012-11-28 11:15:40

标签: c++ visual-studio-2010

我一直在为课程分配工作,我一直收到一个我无法解决的错误。这是我的一部分代码。

#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std; 

const int SIZE = 444;

int main()

{

char person1a[SIZE], person1b[SIZE], person2a[SIZE], person2b[SIZE],  person3a[SIZE], person3b[SIZE],       
     person4a[SIZE], person4b[SIZE];

inData >> person1a[SIZE], person1b[SIZE], person2a[SIZE], person2b[SIZE],       person3a[SIZE], person3b[SIZE], person4a[SIZE], person4b[SIZE]; 

return 0;

}

代码还有更多,但我已将问题缩小到这些行。无论我如何安排它们或我使用的操作符,我总是在第一个数组得到一个堆栈错误。我至少尝试过这个显而易见的事情,比如

inData >> person1a;
inData >> person1b;
etc
inData >> person1a >> person2b >> etc

等等,但我无法克服这个错误。

我在这里遗漏了一些明显的东西,如果我能帮助我,可以帮助我吗?

为了记录,我知道有几个关于这个的主题已经,但我现在只在学校开设我的第一个编程课,所有其他主题都有很多额外的内容,我无法理解。

3 个答案:

答案 0 :(得分:2)

您的数组声明为:

char person1a[SIZE]; 

访问数组时有效的下标是0SIZE-1

声明:

inData >> person1a[SIZE], person1b[SIZE], person2a[SIZE], person2b[SIZE],       person3a[SIZE], person3b[SIZE], person4a[SIZE], person4b[SIZE]; 

你正在写一个超过为每个数组分配的内存。

因为,您使用的是C ++,所以应该使用std::string而不是c风格的数组 它可以为您节省所有这些问题,并提供字符数组为您提供的所有功能。

答案 1 :(得分:2)

当您访问person1a[SIZE]等时,您正在违反数组边界 数组索引从0开始,因此最大索引为SIZE-1而非SIZE

答案 2 :(得分:2)

inData >> person1a[SIZE]

假设inData是某种std::istream或类似的,它将单个字符流式传输到数组的元素SIZE中。由于这是数组的大小,并且有效索引在[0,SIZE-1]范围内,因此它会超出数组而导致堆栈损坏。

如果您打算读取一个字符串,请读入数组本身:

inData >> person1a

当然,如果用户输入太多字符,这也会导致损坏,因此请使用std::string来存储字符串,而不是乱用字符数组。

此外,要链接到多个链接>>

inData >> person1a >> person1b >> ...;

您的代码使用逗号运算符,这意味着您实际上只是流式传输到person1a,并且该语句的其余部分无效。

相关问题