C++六维动态数组存值触发segmentation fault问题
问题根因
段错误来自C++函数的值传递语义:
main中定义的int****** ptr是未初始化的野指针,没有指向任何合法内存- 调用
allocatememory(ptr, ...)时,传入的是ptr的拷贝,函数内的形参ptr是栈上的临时变量,和main里的原始ptr是两个完全独立的变量 - 你在
allocatememory内给形参ptr分配内存、赋值的所有操作,都只作用在临时副本上,main里的原始ptr始终是未初始化的野指针。后续访问野指针指向的内存,不管偏移量是多少,哪怕是0偏移的起始位置,都会触发段错误。
修复方案
最直接的修复方式是把内存分配函数的第一个参数改为6级指针的引用,让函数内操作的是main中的原始指针,而非临时副本。
修正后的完整代码如下:
#include<iostream> using namespace std; // 第一个参数改为指针引用类型 void allocatememory(int******&,int,int,int,int,int,int); void fillArray(int******&,int,int,int,int,int,int,int); int main(){ int****** ptr; allocatememory(ptr, 3,5,7,9,8,4); fillArray(ptr, 3,5,7,9,8,4,20); // 实际使用时需要反向逐层释放内存,避免泄漏,此处省略释放逻辑 return 0; } void fillArray(int****** ptr,int a,int b,int c,int d,int e,int f,int val){ int x=val; for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { for (int k = 0; k < c; k++) { for (int l = 0; l < d; l++) { for (int m = 0; m < e; m++) { for (int n = 0; n < f; n++) { ptr[i][j][k][l][m][n]=x; x++; } } } } } } } void allocatememory(int******& ptr,int a,int b,int c,int d,int e,int f){ ptr=new int*****[a]; for (int i = 0; i < a; i++) { ptr[i]=new int****[b]; for (int j = 0; j < b; j++) { ptr[i][j]=new int***[c]; for (int k = 0; k < c; k++) { ptr[i][j][k]=new int**[d]; for (int l = 0; l < d; l++) { ptr[i][j][k][l]=new int*[e]; for (int m = 0; m < e; m++) { ptr[i][j][k][l][m]=new int[f]; } } } } } }
额外提示:手动管理6级指针的动态内存极易出错,还会带来额外的访存开销和内存碎片问题。实际开发中更推荐用一维连续内存模拟多维访问,或者直接使用嵌套的
std::vector,不需要手动管理内存,能规避绝大多数这类指针错误。
内容的提问来源于stack exchange,提问作者King of the hill
相关产品推荐
相关产品推荐

