2016-11-30 11 views
-6

入力ファイルに基づいて動的配列を作成しようとしていて、gdcで有用な情報がないセグメンテーションフォールトエラーがスローされました。 デバッグ中にNtotが正しく読み込まれているかどうかを調べてみて、何とかエラーを修正しました。 coutを削除すると(例のように)、エラーが返されます。私がcoutを含んでいないと、セグメンテーションフォルト(コアダンプされた)ですか?

#include <iostream> 
#include <math.h> 
#include <fstream> 
#include <stdlib.h> 

using namespace std; 

int main(){ 

double **number; 

int i, Ntot; 

ifstream input("initial_parameters.dat"); 

input >> Ntot; 

//cout<<Ntot<<endl; 
//uncomenting this removes the error 

number = (double**)malloc(sizeof(double*) * (5)); 
for (int i = 1; i <= 5; i++) 
    number[i] = (double*)malloc(sizeof(double) * (Ntot)); 

    number[1][1] = 1.; 
    cout<<number[1][1]<<endl; 
    number[2][1] = 2.; 
    cout<<number[2][1]<<endl; 
    number[3][1] = 3.; 
    cout<<number[3][1]<<endl; 
    number[4][1] = 4.; 
    cout<<number[4][1]<<endl; 
    number[5][1] = 5.; 
    cout<<number[5][1]<<endl; 

return 0; 

} 

編集:作業配列の初期化は、次のとおり

double** number = new double*[5]; 
for (int i = 0; i < 5; i++) 
    number[i] = new double[Ntot]; 
+6

なぜ、オハイオ州*なぜ*あなたがCで 'malloc'を使用しています++ ? – UnholySheep

+7

境界外に割り当てられたメモリに書き込むため、未定義の動作が発生します。 C++では、インデックスは '0'から' size - 1'になります。 –

+4

配列の最初の要素はインデックス0にあります。 'number [5]'にアクセスすると、未定義の動作が発生します。 –

答えて

1

スタートは、C/C++でのインデキシングはまた0としない1

for (int i = 0; i < 5; i++) 

からのものであるので、以降のインデックス0からメモリを割り当てますすべてnumber[i][j]ii - 1で置き換えてください。 number[1][1] = 1.number[0][1] = 1.などのように。

も、代わりに使用し、mallocを使用していない(とあまりにもその結果をキャスト入力しないでください!)new

number[i] = new double[Ntot]; 
+0

mallocを代わりに使用してみましたが、新しいコードで元のコードを使用していましたが、私の大きな作業はC言語に基づいています。修正する必要があります。あなたが提案した変更をやり直すと、セグメンテーションエラーが再び発生しました。 –

+0

あなたの問題が解決されたと思われます。回答を受け入れたものとしてマークしてください。 @A.Dakroury – Jarvis

関連する問題