Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要解释memcpy从3d阵列到1d阵列_C++_Arrays - Fatal编程技术网

C++ 需要解释memcpy从3d阵列到1d阵列

C++ 需要解释memcpy从3d阵列到1d阵列,c++,arrays,C++,Arrays,为什么我不能使用memcpy将三维动态分配阵列展平为一维阵列 3d和1d动态分配阵列的存储有什么区别 谢谢你的关注。如果你能给出一些解释/链接/书籍,我将不胜感激 #include<iostream> using namespace std; int main() { float ***b; int i,j,k; int ntab=26,ncrss=3,nsubs=1; b=(float**

为什么我不能使用memcpy将三维动态分配阵列展平为一维阵列

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;
}
#包括
使用名称空间std;
int main()
{               
浮动***b;
int i,j,k;
int ntab=26,ncrss=3,nsubs=1;
b=(浮动***)malloc(ntab*ncrss*nsubs*sizeof(浮动));

对于(i=0;i您有多个对malloc的调用,这意味着您的3d数组在内存中不是连续的。因此memcpy无法一次处理所有的调用

如果已以连续方式分配3d阵列:

malloc(浮动大小)*ntab*ncrss*NSUB)


然后memcpy就可以工作了。

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

如果已以连续方式分配3d阵列:

malloc(浮动大小)*ntab*ncrss*NSUB)


然后memcpy就可以工作了。

在代码片段中构造的三维动态数组是指向指针数组的指针,指向指向值数组的指针数组。

当memcpy与b作为源一起使用时,它意味着b指向的数组被复制。它意味着指向值数组的指针数组的指针数组被复制

在这种情况下,该行

//memcpy(a,b,ntab*ncrss*nsubs*sizeof(float));
复制从b指向的地址开始的
ntab*ncrss*nsubs*sizeof(float)
字节


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

当memcpy与b作为源一起使用时,它意味着b指向的数组被复制。它意味着指向值数组的指针数组的指针数组被复制

在这种情况下,该行

//memcpy(a,b,ntab*ncrss*nsubs*sizeof(float));
复制从b指向的地址开始的
ntab*ncrss*nsubs*sizeof(float)
字节


因为您分配的不是真正的3D数组。它模拟了一个3D数组,这样您就可以使用数组索引符号来访问它。但从技术上讲,它不是一个需要在内存中连续的3D数组。您的代码使指针指向一个动态分配的指针数组,该数组指向一个指针数组等,这是使用非连续块实现编程概念“3-d数组”的一种方法,但显然它不是一个单一的连续块。有些人甚至反对使用术语“3-d数组”来描述这种情况,尽管在C标准中严格没有任何类型的多维数组(可能有数组数组,或者递归的指针数组)。谢谢!@M.M我错认为这个“3D数组”存储在单个连续块中。因为您分配的不是真正的3D数组。它模拟一个3D数组,以便您可以使用数组索引符号来访问它。但从技术上讲,它不是一个3D数组,需要在内存中连续。您的代码使指针指向一个动态分配的指针数组,该数组指向一个数组指针等,这是一种使用非连续块实现编程概念“3-d数组”的方法,但显然它不是一个单独的连续块。有些人甚至反对使用术语“3-d数组”来描述这样的事情,尽管在C标准中严格没有任何类型的多维数组(可能有数组数组,或者递归的指针数组)。谢谢!@M.M我错认为这个“3D数组”存储在一个连续的块中。整行可以是
float(*b)[ncrss][ntab]=malloc(sizeof(float[nsubs][ncrss][ntab]))谢谢你的清晰解释。很遗憾,我能选择一个被接受的答案。整行可以是
float(*b)[ncrss][ntab]=malloc(sizeof(float[nsubs][ncrss][ntab]))
谢谢你的清晰解释。很遗憾,我只能选择一个被接受的答案。非常感谢你的帮助和你的数字,这真的帮助我理解分配。非常感谢你的帮助和你的数字,这真的帮助我理解分配。