2016-06-13 62 views
0

我現在正在用VC++工作幾個月。直到今天,我從來沒有遇到過「堆棧溢出」錯誤,當我嘗試傳遞一個結構的功能。堆棧溢出錯誤:將struct傳遞給函數vC++

這是我的代碼:

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

+1

你的結構體大小爲800K。其中三個需要2M +。默認的堆棧大小是1M - 'FILE_DATA [3]'不可能適合它。避免將大的變量放在堆棧上,而是將它們分配到堆上。我也質疑定義這樣一個大結構的智慧,考慮使用類型'std :: vector '或類似的成員來代替巨大的固定大小的數組。 –

回答

0

爲什麼堆棧溢出錯誤被拋出(只要它進入ReadFiles()?

這是因爲FILE_DATA [3]堆棧內存的大小默認約爲1Mb,FILE_DATA [3]的大小約爲2.4Mb(〜800,000×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; 
} 
1

這不僅壞,而且糟糕的設計。你應該:

  • 使用vectorGOOD和替代File_Data->CRASH_VALUES[iLine]分配BAD
  • 使用vector.push_back
  • 使用動態分配(如果您不使用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]; 
    ...