使用'memcpy'功能

时间:2013-06-18 11:43:17

标签: c arrays function

要将数组b[]复制到数组a[],可以使用函数memcpy,如下所示;   memcpy(a,b,sizeof(a))
  但是memcpy只是将字节从一个地方复制到另一个地方 我的问题是:

  

1.How memcpy如何通过复制字节将数组b[]的元素复制到a[]中?
  2.为什么sizeof(a)作为参数提供?

我是编程新手,温柔。

6 个答案:

答案 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作为更安全的替代方案,但仍然如此。