要将数组b[]
复制到数组a[]
,可以使用函数memcpy
,如下所示;
memcpy(a,b,sizeof(a))
。
但是memcpy
只是将字节从一个地方复制到另一个地方
我的问题是:
1.How
memcpy
如何通过复制字节将数组b[]
的元素复制到a[]
中?
2.为什么sizeof(a)
作为参数提供?
我是编程新手,温柔。
答案 0 :(得分:5)
sizeof(a)
是数组a
的总大小。例如,在
int a[3];
printf("%d", sizeof(a));
在大多数系统上, sizeof a
将为12
(因为int
通常为4个字节,而您有3个字节。)
memcpy
不知道a
是一个数组。它只知道a
指向一些内存地址,所以你必须告诉它要传递多少字节。大多数地方都将memcpy的签名描述为:
void *memcpy(void *dst, const void *src, size_t nbytes)
答案 1 :(得分:2)
#include <string.h>
void *
memcpy(void *s1, const void *s2, register size_t n)
{
register char *p1 = s1;
register const char *p2 = s2;
if(n) {
n++;
while (--n > 0) {
*p1++ = *p2++;
}
}
return s1;
}
这是memcpy的源代码。正如您所看到的,它从字面上移过寄存器1中的每个元素并逐个移动到寄存器2中。
使用的是大小,因此它知道寄存器有多大,所以基本上它在复制整个寄存器之前必须跳过多少元素。
答案 2 :(得分:1)
memcpy
就像汇编指令MOV
的工作原理一样(显然,memcpy
必须使用MOV
来实现)。区别在于,我们移动一个数据块,而不是一个变量。块的大小是必需的,因为该过程需要知道要从一个位置复制到另一个位置的字节数。
答案 3 :(得分:0)
1)在C中,所有数组实际上只是长序列中的数据字节,一个接一个。没有散布的元数据或类似的东西,因此复制数组的字节意味着复制数组本身而不会丢失数据,无论数组由何种类型组成。只有总尺寸很重要。
2)这是Kerrek SB所说的,“因为你不能在C中使用数组类型的函数参数”。与1相关联 - 由于C数组中没有元数据,因此该函数不会获得有关数组大小的信息,只是内存开始的位置。大小是这样,它可以知道何时停止写入数据。
答案 4 :(得分:0)
sizeof(a)作为第三个参数提供,因为它是数组a的字节大小。实际上,使用数组作为参数调用sizeof将返回该数组中的总字节数,而不是数组标识符所表示的指针的大小。
答案 5 :(得分:0)
首先是一个有趣的问题。是的,这是一个简单的二进制副本,但复制顺序很重要。比如,如果你有一个重叠区域,并且&amp; a [0]&gt; &amp; b [0],会发生什么?如果是从左到右,memcpy只会在复制时覆盖b []中的数据。
AFAIK,复制的特定顺序并未由任何标准指定,建议使用memmove作为更安全的替代方案,但仍然如此。