2016-11-30 32 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; 

} 

編輯:工作數組初始化是:從索引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++) 

另外通過i - 1在上述所有number[i][j]更換i。像number[1][1] = 1.number[0][1] = 1.等。

並且還,不使用malloc(和它的結果也沒有,鑄鉛字!),而是使用new

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

我試着使用malloc作爲替代具有新的沒有結果後,原來的代碼我更大的工作是基於在C這裏這麼幾件事情,有需要修復。做你所建議的改變,我最終再次得到了分割錯誤。 –

+0

我想你的問題已經解決了,請將答案標記爲已接受。 @ A.Dakroury – Jarvis