有没有办法只需执行一次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
}
答案 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
操作将二进制0x01010101
(int
)填入所有memset
个元素。
因此,无论您的计算机上int
的大小如何(除非它只是一个字节!),您不应期望看到值1
。
我希望这会有所帮助。
答案 2 :(得分:0)
C中的多维数组是一个没有内部结构的平坦内存块。多维数组的内存布局与相同总大小的1维数组的内存布局完全相同。多维接口通过简单的索引重新计算实现。您可以始终memcpy
整个多维数组,就像在代码中一样。
当然,这仅适用于内置的多维数组,显式声明为此类(如代码示例中所示)。如果将手工制作的多维数组实现为指向子数组的指针数组,那么该数据结构将无法通过memcpy
一次性复制。
然而,显然你对memset
的工作原理有一些误解。您的memset(&array1,1,sizeof(array1));
不会使用1
填充数组,这意味着无论您打印哪个数组,您的代码都不应打印1
。 memset
将目标内存解释为char
的数组,而不是int
的数组。
memset
可用于将内存设置为零。对于非零值,memset
通常不适合初始化char
以外的任何类型的数组。