2016-11-30 84 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