1

我不明白为什么当我进入主函数时会立即出现堆栈溢出。我应该从文本文件中读取并进行一些处理。有人可以向我解释原因并建议如何解决吗?

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <fstream>
#include <iomanip>

using namespace std;
const int MAX=100;
enum countrytype{S,F};

struct dob
{
int day;
int month;
int year;
};

struct Local
{
char country[MAX];
char gender[MAX];
char name[MAX];
dob birthday;
int noofmod;
char mod[MAX][MAX];
int mark[MAX];

};

struct Foreign
{
char country[MAX];
char gender[MAX];
char name[MAX];
dob birthday;
int noofmod;
char mod[MAX][MAX];
int mark[MAX];

};

union Student
{
Local localstudent;
Foreign foreignstudent;

};

struct UOWstudent
{
countrytype ct;
Student st;

};

void readfile(ifstream &read,UOWstudent noofstudent[MAX]);

int main()
{
UOWstudent noofstudent[MAX];
ifstream read;

readfile(read,noofstudent);
cout<<endl
    <<noofstudent[0].st.foreignstudent.country
    <<endl
    <<noofstudent[0].st.foreignstudent.gender
    <<endl
    <<noofstudent[0].st.foreignstudent.name;



system("PAUSE");

}

void readfile(ifstream &read, UOWstudent noofstudent[MAX])
{
int i=0;
char country;
char filename[MAX];
cin>>filename;
read.open(filename);




    read>>country;
    /*if (country =='F')
    {
        read.getline(noofstudent[i].st.foreignstudent.country,MAX);

        read>>noofstudent[i].st.foreignstudent.gender;
        read.getline(noofstudent[i].st.foreignstudent.name,MAX);

    }

    else
        read.getline(noofstudent[i].st.foreignstudent.country,MAX);*/




}

这是我的文本文件

F South Korea
Male Psy Park Jae Sang
31 - 12 -1977
3 CSCI114 55 CSCI103 44 GangNam
4

2 回答 2

8

简而言之,您的代码将其所有存储分配到堆栈上,并且您分配的内存超出了允许的限制。

看看你为什么超过限制可能更有用。

的第一行main()是在堆栈上分配一个 100 (MAX = 100) 个学生的数组:

UOWstudent noofstudent[MAX];

有多大UOWstudent?您可以通过查看每个字段来弄清楚:

struct UOWstudent
{
    countrytype ct; // enum. let's assume 4 bytes. (32-bit executable)
    Student st;     // ???
};

学生有多大?

union Student
{
    Local localstudent;
    Foreign foreignstudent;
};

这是本地或外国的大小,所以让我们看一个。我们需要对 char 的大小做另一个假设。让我们假设1 byte(8 位字符):

struct Local
{
    char country[MAX];  // 100 bytes
    char gender[MAX];   // 100 bytes
    char name[MAX];     // 100 bytes
    dob birthday;       // 3 ints or 12 bytes (32-bit assumption again)
    int noofmod;        // 4 bytes
    char mod[MAX][MAX]; // 10,000 bytes
    int mark[MAX];      // 400 bytes
};                      // total: 10,716 bytes

因此 main() 的第一行尝试在堆栈上分配 (10,716 + 4) x 100 = 1,072,000 字节。我对编译器设置的 char 和 int 的大小做了最保守的假设,它们很可能会更高。如果堆栈限制确实是 1 兆字节(1,048,576 字节),那么这个初始分配就会超出限制。

您可以使用 C 的 sizeof 运算符来获取有关类型的实际大小的信息。 请参阅this stackoverflow answer,讨论在堆上分配数组,而不是在堆栈上,这是解决问题的好一步。 (UOWstudent == 滑铁卢大学学生?)

于 2013-01-05T05:45:26.367 回答
1

MAX 被定义为 100(它真的需要吗?)并且你有一堆长度为 MAX 的字符数组,你甚至有一个 2D 数组,这是巨大的。所以你的结构很大,可能超过了最大堆栈大小——我认为它在 Windows 中是 1024Kb。

于 2013-01-05T05:32:08.513 回答