使用malloc定义数组写入netCDF 3D数据出现维度超限错误如何解决
问题解答
1. 动态分配一维数组转二维数组用法
你提到的转换完全可以实现,C99及以上标准支持变长数组指针,写法如下:
float *arr = malloc(ny * nx * sizeof(float)); float (*arr0)[nx] = (float(*)[nx])arr; // 之后就可以用 arr0[y_idx][x_idx] 的形式访问元素,内存布局和静态二维数组完全一致,netCDF接口直接传 arr 或者 &arr0[0][0] 都可以正常工作
netCDF的nc_put_vara_float只要求传入的指针指向连续内存块,和内存是静态分配还是动态分配没有关系,这一点你的理解是正确的。
2. Start+count exceeds dimension bound报错原因及修复
报错的核心原因是输出变量的维度和你写入时传入的count参数不匹配:
- 你创建输出文件维度时,x维度长度为
nres_x = 288/12 = 24,y维度长度为nres_y = 24 - 但你全局定义的count数组是
count[ndim] = {1, ny, nx},其中ny、nx均为288,相当于要往长度只有24的维度里写入288个元素,自然会触发越界错误。
修复步骤:
- 单独定义写入输出时的count参数,不要和读取输入的count混用,示例如下:
在调用nc_put_vara_float前定义输出专用的count数组:
size_t out_count[ndim] = {1, nres_y, nres_x}; if ((retval = nc_put_vara_float(out_ncid, out_var_id, start, out_count, &out_var[0]))) err(retval);
- 其他隐患修复:
- 你代码中
nc_def_var定义输出变量的行末尾漏了错误处理的err(retval);,补上可避免潜在问题 out_var初始malloc的长度写为nres_y * nres_y,建议修正为nres_y * nres_x,避免后续x和y分辨率不同时触发内存越界out_var = fld_init(...)会覆盖你最初malloc的指针,导致原有内存泄漏,建议检查fld_init的实现,要么直接传入最初malloc的内存修改,要么先free掉原指针再赋值新返回的指针
内容的提问来源于stack exchange,提问作者Redshoe
相关产品推荐
相关产品推荐

