为什么我不能使用memcpy将3d动态分配的数组展平为1d数组?
存储3d和1d动态分配数组有什么区别?
感谢您的关注。如果您能提供一些解释/链接/书籍,我将非常感激。
#include<iostream>
using namespace std;
int main()
{
float ***b;
int i,j,k;
int ntab=26,ncrss=3,nsubs=1;
b=(float***)malloc(ntab*ncrss*nsubs*sizeof(float));
for(i=0;i<nsubs;i++)
{
b[i]=(float**)malloc(ncrss*ntab*sizeof(float));
for(j=0;j<ncrss;j++)
{
b[i][j]=(float*)malloc(ntab*sizeof(float));
}
}
for(i=0;i<nsubs;i++)
for(j=0;j<ncrss;j++)
for(k=0;k<ntab;k++)
b[i][j][k]=k;
for(i=0;i<nsubs;i++)
for(j=0;j<ncrss;j++)
for(k=0;k<ntab;k++)
printf("b[%d][%d][%d]=%f\n",i,j,k,b[i][j][k]);
float *a;
a=(float*)malloc(ntab*ncrss*nsubs*sizeof(float));
//memcpy(a,b,ntab*ncrss*nsubs*sizeof(float));
for(i=0;i<nsubs;i++)
{
const int index1=i*ncrss*ntab;
for(j=0;j<ncrss;j++)
{
const int index2=j*ntab+index1;
for(k=0;k<ntab;k++)
{
a[index2]=b[i][j][k];
}
}
}
for(i=0;i<ntab*ncrss*nsubs;i++)
printf("a[%d]=%f\n",i,a[i]);
return 0;
}
答案 0 :(得分:3)
您有多次调用malloc,这意味着您的3d数组在内存中不连续。因此,memcpy无法立即处理所有内容。
如果您以连续的方式分配了3d数组:
malloc(sizeof(float) * ntab * ncrss * nsubs)
然后memcpy会起作用。
答案 1 :(得分:2)