自己写了一个HMM前向算法,发现了好多的问题,这里把多维数组的创建以及销毁问题进行解释,希望可以帮助到有需要的人还有我自己,日后可能用的到。
创建:
void mallocCalcSpace(int N, int T) { //创建二维数组alpha[N][T] double** alpha = new double*[N]; for(int i=0; i<N; i++) alpha[i] = new double[T]; //创建三维数组xi[N][N][T-1] double*** xi = new double**[N]; for(int i=0; i<N; i++) { xi[i] = new double*[N]; for(int j=0; j<N; j++) xi[i][j] = new double[T-1]; } }
销毁:这是需要注意的地方
void deleteCalcSpace(int N, int T) { //释放数组alpha的内存空间 for(int i=0; i<N; i++) delete []alpha[i]; delete []this->alpha; //释放数组xi的内存空间 for(int i=0; i<N; i++) { for(int j=0; j<N; j++) delete []xi[i][j]; delete []xi[i]; } delete []this->xi; }
切忌不要单纯的delete []alpha或者delete []xi。并且要注意释放的顺序,按照你创建空间的逆顺序
================
另外贴一个同仁发的多维数组创建在内存中的分配例子:
方法1:用一维数组代替二维数组
int n,m; cin>>n>>m; int* a = new int[n*m]; for(int i = 0 ; i<n ; ++i) { cout<<endl; for(int j = 0 ; j<m ; ++j) { a[i*m+j] = i+j; cout<<a[i*m+j]<<" "<<&a[i*m+j]<<" "; } } cout<<endl; delete[] a;
运行结果:
0 00491BB0 1 00491BB4 2 00491BB8 1 00491BBC 2 00491BC0 3 00491BC4 2 00491BC8 3 00491BCC 4 00491BD0
各个元素的内存地址是递增的,是在堆区里分配的内存空间。
方法2:二维数组
int n,m; cin>>n>>m; int** a = new int*[n];\\\\\创建指针数组 for(int i = 0;i<n;i++) { a[i] = new int[m];\\\\\\\\为每一行分配空间 } for(int f =0;f<n;f++) { for(int j =0;j<m;j++) { a[f][j] = f+j;\\\\\\\\\\\\为数组赋值 } }
其实大家更关心二维数组在内存中是如何分配空间的:
输出每个元素的地址:
for(int k = 0;k<n;++k) { cout<<endl; for(int s = 0;s<m;++s) { cout<<&a[k][s]<<" "; } }
输出结果:
00491B40 00491B44 00491B48 004918D0 004918D4 004918D8 00491890 00491894 00491898
每一行的相邻元素地址是递增的,连续的,不同行之间的地址就不连续了。