2013-03-25 71 views
0

我在我的课上有一个如下函数。指向2d数组,程序编译但在运行时抛出分段错误

bool ncread_llt::get_dataArray_atOnce (float **data) 
{ 
    startp[0]=0; 
    countp[0]=ntime; 
    float vdata[ntime][nlat][nlon]; 
    dataVar.getVar(startp, countp, &vdata); 
    int offset=0; 
    for(int t =0; t<ntime; t++) 
    { 
     for (int i = 0; i < nlat - 1; i++) 
     { 
      for (int j = 0; j < nlon - 1; j++) 
      { 
       offset=i*nlat+j; 
       data[t][offset]=vdata[t][i][j]; 
      } 
     } 
    } 
    return(true); 
} 

,我把它在我的主要程序是这样

float **rain[ntime][rain_pts]; //I get segfault in the next line. 
    ncf1.get_dataArray_atOnce (**rain); //ncf1 is an object of the classs ncread_llt 

这个事情的作品与载体格式,但我需要使用的库函数这就需要二维数组作为输入。我不知道Iam在这里做了什么错误。我尝试过几种指针符号的组合,但它不能编译,编译时(上面的组合)会出现分段错误。这段代码有什么问题,以及它编译的原因。

+0

你能发布你得到的编译错误和他们相关的行号吗? – 2to1mux 2013-03-25 03:34:13

+0

../simplyMapBase/swlib/ncio.hh:45:注意:候选人是:bool ncread_llt :: get_dataArray_atOnce(double **) ../simplyMapBase/swlib/ncio.hh:46:note:bool ncread_llt :: get_dataArray_atOnce (float **) 当我调用函数为ncf1.get_dataArray_atOnce(rain); – 2013-03-25 04:16:42

+0

大多数时候,我不知道是谁告诉你'type ** var'和类型'var [n] [m];'是等价的,但是你可以告诉他们他们错了*。他们不是。你正在声明一个'[ntime] [rain_pts]'指向浮点指针的数组,然后对它进行双解引用(有效地检索rain [0] [0],这是一个不确定的指向指针的指针并将其发送到'get_dataArray_atOnce()'。正如所写的,'get_dataArray_atOnce()'中的'data'没有办法正确解除引用。 – WhozCraig 2013-03-25 05:07:25

回答

0

此行float **rain[ntime][rain_pts];创建并用于指针一个2维阵列分配存储器(允许调用此阵列A)到2维阵列浮动每个(指针ntime*rain_pts数据阵列)。这些数据阵列的内存是而不是此时分配的。

**rain取消引用指针数组A,并获取第一个指针(尚未初始化),然后将其传递给get_dataArray_atOnce函数。由于指针未初始化解引用,它会导致未定义的行为。

如果你只是想的ntime*rain_pts浮体2维数组传递给你的函数,你可以这样创建:

float **rain = new float*[ntime]; 
for (int i = 0; i < ntime; ++i) 
{ 
    rain[i] = new float[rain_pts]; 
} 

比它传递这样的:

ncf1.get_dataArray_atOnce (rain); 
0

谢谢@ Serg lef,我采用了以下方式和工作方式。 我不知道分配内存和指针的概念。

float **rain; 
rain=new float *[ntime]; 
for (int i=0; i<ntime; i++) 
    rain[i]=new float[rain_pts]; 

然后

ncf1.get_dataArray_atOnce (rain); 

谢谢大家的回复。

相关问题