2012-02-27 271 views
0

我正在製作一個C++程序,它應該從標準輸入中讀入一個整數N.然後它應該從文件「data.txt」中讀取一個大小爲N的數組。然後它應該將它傳遞給一個函數,數組並返回一個指向新數組的指針。然後它應該打印返回的指針數組的內容。但每次運行該程序都會崩潰。有任何想法嗎?爲什麼程序崩潰?

#include <iostream> 
#include <fstream> 

using namespace std; 

int * reverseArray(int * arr, const int size) 
{ 
//int arr1[size]; 
int *arr2 = new int[size]; 
for(int iii = 0; iii < size; iii++) 
{ 
    (*(arr2+iii)) = (*(arr + size - 1 - iii)); 
} 

return arr2; 
} 

int main() 
{ 
int N; 
cin >> N; 
if(N >= 0 && N <= 50) 
{ 
    ifstream inputFile; 
    inputFile.open("data.txt"); 
    int *arr = new int[N]; 
    int iii = 0; 
    while(inputFile >> (*(arr+iii)) && iii < N) 
    { iii++;} 

    arr = reverseArray(arr, N); 

    for(int jjj = 0; jjj < N; jjj++) 
    { 
     cout << (*(arr+jjj)) << endl; 
    } 

    delete [] arr; 
    inputFile.close(); 
} 

return 0; 
} 
+0

你能發佈你得到的確切的錯誤嗎? – 2012-02-27 15:50:33

+2

那麼,它在哪裏崩潰?如果這是C++,爲什麼不使用'std :: vector'和'std :: reverse'?另外,你正在泄漏你最初分配給'arr'的內存(也是切換到'std :: vector'的一個很好的理由)。 – Chad 2012-02-27 15:51:26

+0

does'data.txt'是否存在於所需的位置? – Naveen 2012-02-27 15:53:45

回答

6

我認爲這個問題是在這裏:

while(inputFile >> (*(arr+iii)) && iii < N) 

的檢查,以確保iii小於N訪問後發生。重新排序的條件:

while(iii < N && inputFile >> (*(arr+iii))) 

注意這條線引入了內存泄漏:

arr = reverseArray(arr, N); 

由於這是C++考慮使用std::vector<int>代替。

+1

做得很好,發現墜毀。 – CashCow 2012-02-27 16:06:57

+0

哇,你們真棒。這正是問題,我只是顛倒了順序,我相信我通過將函數的返回分配給另一個指針並刪除該指針來擺脫內存泄漏。謝謝! – 2012-02-27 20:23:46

+0

@ScottFink,如果這解決了問題,你可以[接受答案](http://meta.stackexchange.com/q/5234/162011)? – hmjd 2012-03-08 17:02:24

0

我建議將其更改爲以下內容。雖然會指出你會得到未定義的輸出,如果N < data.txt中的項數。

while (iii < N && inputFile.good()) 
{ 
    inputFile >> *(arr+iii); 
    ++iii; 
} 

int *arrRev = reverseArray(arr, N); 

for(int jjj = 0; jjj < N; ++jjj) 
{ 
    cout << (*(arrRev+jjj)) << endl; 
} 

delete [] arr; 
delete [] arrRev; 
inputFile.close();