指向二维数组的指针,程序编译时抛出分段错误
pointer to 2d array, program compiling but throwing segmentation fault at run time
在我的类中有如下函数:
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);
感谢大家的回复。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?