指向二维数组的指针,程序编译时抛出分段错误

pointer to 2d array, program compiling but throwing segmentation fault at run time

本文关键字:分段 错误 编译 程序 二维数组 指针      更新时间:2023-10-16

在我的类中有如下函数:

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

这个东西与向量表示法,但我需要使用一个库函数,需要2d数组作为输入。我不知道我犯了什么错误。我已经尝试了几种指针表示法的组合,但它不编译,当它编译(上述组合)它得到分段错误。这段代码有什么问题吗?为什么会编译

这一行float **rain[ntime][rain_pts];创建并分配内存给一个二维数组指针(我们称这个数组为A)到一个二维浮点数组(指向ntime*rain_pts数据数组的指针)。此时为这些数据数组分配的内存是而不是

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

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

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

然后像这样传递:

ncf1.get_dataArray_atOnce (rain);

谢谢@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);

感谢大家的回复。