memcpy for multidimensional array

时间:2014-10-03 23:27:23

标签: c

有没有办法只需执行一次memcpy操作就可以将每个元素从一个多维数组复制到另一个多维数组?

int array1[4][4][4][4];
int array2[4][4][4][4];
int main()
{
    memset(&array1,1,sizeof(array1));
    memset(&array2,0,sizeof(array2));
    printf_all("value in array2 %d \n",array2[1][1][1][1]);
    memcpy(&array2,&array1,sizeof(array2));
    printf("memcopied in array2 from array1 \n");
    printf("value in array2 %d \n",array2[1][1][1][1]); //not printing 1
}

3 个答案:

答案 0 :(得分:1)

是的,您的代码应该已经是正确的。

执行此操作时,您必须考虑内存布局。数组都在一个块中,多维基本上是编译器完成的数学技巧。

您的代码表示将此内存内容复制到另一个内存块。由于两者共享相同的布局,因此它们将包含相同的值。

以下代码也只是复制值,但访问的处理方式不同,因此您必须考虑如何使元素的顺序正确。

int array1[4][4][4][4]; //elements 256
int array2[256]; 

int main()
{
    memcpy(&array2,&array1,sizeof(array1)); //will also copy
    // original access via: a + 4 * b + 16 * c + 64 * d
}

答案 1 :(得分:1)

您的代码是正确的。您应该期望输出显示值1。假设4字节为16843009,您应该期望它显示int的值。

原因是:您正在使用值为array1字节填充1,而不是使用值为1 ints 。即,使用00000001000000010000000100000001操作将二进制0x01010101int)填入所有memset个元素。

因此,无论您的计算机上int的大小如何(除非它只是一个字节!),您不应期望看到值1

我希望这会有所帮助。

答案 2 :(得分:0)

C中的多维数组是一个没有内部结构的平坦内存块。多维数组的内存布局与相同总大小的1维数组的内存布局完全相同。多维接口通过简单的索引重新计算实现。您可以始终memcpy整个多维数组,就像在代码中一样。

当然,这仅适用于内置的多维数组,显式声明为此类(如代码示例中所示)。如果将手工制作的多维数组实现为指向子数组的指针数组,那么该数据结构将无法通过memcpy一次性复制。

然而,显然你对memset的工作原理有一些误解。您的memset(&array1,1,sizeof(array1));不会使用1填充数组,这意味着无论您打印哪个数组,您的代码都不应打印1memset将目标内存解释为char的数组,而不是int的数组。

memset可用于将内存设置为零。对于非零值,memset通常不适合初始化char以外的任何类型的数组。