2012-02-27 11 views
0

標準入力から整数Nを読み込むC++プログラムを作成しています。ファイル "data.txt"の値をサイズNの配列に読み込む必要があります。新しい配列へのポインタを返します。次に、返されたポインタの配列の内容を出力する必要があります。しかし、プログラムを実行するたびにクラッシュします。何か案は?プログラムがクラッシュするのはなぜですか?

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

iiiを確保するためのチェックが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

あなたは正確なエラーを投稿できますか? –

+2

だから、どこがクラッシュするのですか?これがC++の場合は、 'std :: vector'と' std :: reverse'を使わないのはなぜですか?また、あなたはもともと 'arr'に割り当てられたメモリを漏らしています(これは' std :: vector'に切り替える正当な理由です)。 – Chad

+0

'data.txt'は必要な場所にありますか? – Naveen

答えて

6

私はこの問題はここにあると思います。この代わりにstd::vector<int>を使用することを検討してC++であるよう

arr = reverseArray(arr, N); 

:条件を並べ替える:

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

注この行は、メモリリークを導入します。

+1

クラッシュを発見するためによくできました。 – CashCow

+0

うわー、皆さんは素晴らしいです。それはまさに問題だったので、私は順序を逆順にして、関数の戻り値を別のポインタに代入して削除してメモリリークを取り除いたと思います。ありがとう! –

+0

@ScottFink、これで問題が解決した場合は、[回答を受け入れる]ことができます(http://meta.stackexchange.com/q/5234/162011)? – hmjd

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(); 
関連する問題