Stack Overflow错误:将struct传递给函数vc ++

时间:2016-06-13 13:41:05

标签: pointers visual-c++ structure stack-overflow

我正在使用VC ++几个月了。我从未遇到过#Stack; Stack Overflow'错误直到今天我尝试将结构传递给函数。

这是我的代码:

int bReadFileData(string sFile, struct FILE_DATA *File_Data);
const int MAX_CRASH_FILE_SIZE = 100000;
struct FILE_DATA
{
    int SIZE;
    int GOOD[MAX_CRASH_FILE_SIZE];
    int BAD[MAX_CRASH_FILE_SIZE];
};

int bReadFileData(string sFile, struct FILE_DATA *File_Data)
{

File_Data->SIZE = 0;
if(PathFileExists(Convert.StringToCstring(sFile)) == 1)
{
    string sLine = "";
    int iLine = 0;
    std::ifstream File(sFile);
    while(getline(File, sLine))
    {
        if(sLine.find(":") != std::string::npos)
        {
            File_Data->CRASH_VALUES[iLine] = sLine.substr(0, sLine.find(":"));
            File_Data->CRASH_VALUES[iLine] = sLine.substr(sLine.find(":") + 1, sLine.length());
        }
        else
        {
            File_Data->CRASH_VALUES[iLine] = (sLine);
        }
        iLine++;
    }
    File_Data->SIZE = iLine;
}
return 1;
}

`

从主函数我调用下面的方法。

void ReadFiles()
{
    FILE_DATA Files[3];
    bReadFileData("C:\\Test1.txt", &Files[0]);
    bReadFileData("C:\\Test2.txt", &Files[1]);
    bReadFileData("C:\\Test3.txt", &Files[2]);
} 

这段代码有什么问题吗?为什么抛出堆栈溢出错误(一旦输入ReadFiles()?

2 个答案:

答案 0 :(得分:1)

这不仅是坏事,而是糟糕的设计。你应该:

  • vector用于GOODBAD
  • 使用vector.push_back代替File_Data->CRASH_VALUES[iLine]分配。
  • 使用动态分配(如果您不使用vector)。如果您必须使用动态分配,我建议使用make_unique(C ++ 11/14)而不是new,如下所示:
void ReadFiles()
    {
      auto Files = std::make_unique<FILE_DATA[]>(2);
      bReadFileData("C:\\Test1.txt", &Files[0]);
      bReadFileData("C:\\Test2.txt", &Files[1]);
      bReadFileData("C:\\Test3.txt", &Files[2]);
      // delete [] Files; - DONT NEED
      // Files = nullptr;
    }

如果你只需使用vector,就可以拥有:

void ReadFiles()
{
  FILE_DATA Files[3];
  ...

答案 1 :(得分:0)

  

为什么抛出堆栈溢出错误(一旦输入ReadFiles()?

那是因为FILE_DATA [3]为堆栈内存分配了太多字节。堆栈内存的大小默认大约为1Mb,而FILE_DATA [3]的大小大约为2.4Mb(~800,000 x 3字节)。

如果使用大尺寸的结构,请尝试使用堆内存,如下所示:

void ReadFiles()
{
  FILE_DATA* Files = new FILE_DATA[3];
  bReadFileData("C:\\Test1.txt", &Files[0]);
  bReadFileData("C:\\Test2.txt", &Files[1]);
  bReadFileData("C:\\Test3.txt", &Files[2]);
  delete [] Files;
  Files = nullptr;
}