使用 memcpy 复制二维数组

ars*_*ian 3 c

我想使用 memcpy 但它通常定义为指针。我们可以用这个函数为数组分配一个新的内存吗?

例如,我们有一个matrix1[13][15],我们想将它分配给matrix2[13][15]这两个数组是独立的。

use*_*738 6

还有一件事你可能想注意——它是否是这样的并不重要

int *p =&matrix1[0][0];
int *q =&matrix2[0][0];
memcpy(p, q, 13*15*sizeof(*p));
Run Code Online (Sandbox Code Playgroud)

当然你也可以这样做,

memcpy(&matrix2[0][0], &matrix1[0][0], 13*15*sizeof(matrix1[0][0]));
Run Code Online (Sandbox Code Playgroud)
void *memcpy(void * restrict s1,
             const void * restrict s2,
             size_t n);
Run Code Online (Sandbox Code Playgroud)

为什么这有效?因为memcpy函数将n字符从 指向的对象复制到 指向s2的对象中s1。嗯,这基本上总结了您需要使用的所有东西memcpy。那么如果它是一个指针会发生什么 - 策略将是相同的。指针指向源和目标,它们不重叠 - 然后你提到字节。瞧 - 它会复制。

另一件要注意的事情 - 您可以获取这些值1315使用 sizeof 运算符。

size_t rows = sizeof matrix1 / sizeof matrix1[0];
size_t cols = sizeof matrix1[0] / sizeof matrix1[0][0];

memcpy(&matrix2[0][0], &matrix1[0][0], rows*cols*sizeof(matrix1[0][0]));
Run Code Online (Sandbox Code Playgroud)

而且更清楚(潜伏者建议):-

memcpy(&matrix2[0][0], &matrix1[0][0], sizeof matrix1);
Run Code Online (Sandbox Code Playgroud)

这些也可以工作(是chux提到了这一点)

memcpy(matrix2, matrix1, sizeof matrix2);
Run Code Online (Sandbox Code Playgroud)

因为它们都有相同的值 - 指向相同的地址,但它们的类型不同,这在这里无关紧要,因为它被转换为void*.


一个更好的解决方案是(由 chux 建议)

memcpy(&matrix2, &matrix1, sizeof matrix2);
Run Code Online (Sandbox Code Playgroud)