需要解释memcpy从3d数组到1d数组

时间:2017-04-26 01:15:15

标签: c++ arrays

为什么我不能使用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;
}

2 个答案:

答案 0 :(得分:3)

您有多次调用malloc,这意味着您的3d数组在内存中不连续。因此,memcpy无法立即处理所有内容。

如果您以连续的方式分配了3d数组:

malloc(sizeof(float) * ntab * ncrss * nsubs)

然后memcpy会起作用。

答案 1 :(得分:2)

在代码片段中构造的3d动态数组是指向指向数组值指针数组的指针数组的指针。

当memcpy与b一起使用时,它表示复制b指向的数组。这意味着将复制指向数组值指针数组的指针数组。

在这种情况下,行

//memcpy(a,b,ntab*ncrss*nsubs*sizeof(float));

从b指向的地址开始复制ntab*ncrss*nsubs*sizeof(float)个字节。

enter image description here