C/C ++ memcpy()–跨内存位置复制

时间:2020-02-23 14:31:57  来源:igfitidea点击:

C/C ++中的memcpy()函数用于将数据从一个内存位置复制到另一个内存位置。
这是使用指针复制数据的常用方法。

让我们了解如何在本文中使用此功能。

语法

memcpy()函数采用两个内存地址位置(src和dst)作为参数,以及要复制的字节数(n)。

由于C/C ++通常使用void *指针表示内存位置地址,因此对源地址和目标地址的调用为" void * src"和" void * dst"。

该函数返回一个指向目标内存地址" dst"的指针,但是实际上,我们通常不捕获返回值。
(因为我们已经有了指针)

格式:

#include <string.h>

void* memcpy(void* dst, const void* src, size_t n)

头文件 &lt;string.h>是加载此库函数所必需的。

参数:

  • dst->指向目标地址的指针
  • src->指向源地址的指针
  • n->要复制的字节数

返回值

这会将指针返回到目标位置(dst)。

注意:为避免任何类型的溢出,目标和源参数所指向的数组的大小必须至少为n个字节,并且不能重叠。

让我们通过一些示例来了解该功能。

一些例子

这是一个使用memcpy()将字符串从一个位置复制到另一个位置的示例。

#include <stdio.h>
#include <string.h>

int main () {
  //This is constant, since memcpy() will not modify this
 const char src[50] = "theitroad";
 char dest[50];

 strcpy(dest, "Sample");
 printf("Before memcpy(), dest: %s\n", dest);

 //It is strlen(src) + 1 since we also copy the null terminator '
Before memcpy(), dest: Sample
After memcpy(), dest: theitroad

' memcpy(dest, src, strlen(src)+1); printf("After memcpy(), dest: %s\n", dest); return(0); }

输出

#include <stdio.h>
#include <string.h>

int main() {
  //This is constant, since memcpy() will not modify this
  const char src[100] = "This is a theitroad article.";

  char dst[100] = "memcpy";
  
  printf("Before memcpy(), dst is: %s\n", dst);
  
  //Set offsets for both src and dst
  size_t offset_src = 0, offset_dst = 0;
  offset_src += 4;
  offset_dst += strlen(dst);

  memcpy(dst + offset_dst, src + offset_src, strlen(src));

  printf("After memcpy(), dst is: %s\n", dst);

  return 0;
}

这是另一个示例,它使用带有适当偏移量的memcpy()附加字符串。

Before memcpy(), dst is: memcpy
After memcpy(), dst is: memcpy is a theitroad article.

输出将是目标字符串,后跟" is a theitroad article"。

输出

void* memcpy_usr(void* dst, const void* src, size_t n) {
  //Copies n bytes from src to dst
  
  //Since we cannot dereference a void* ptr,
  //we first typecast it to a char* ptr
  //and then do the copying byte by byte,
  //since a char* ptr references a single byte
  char* char_dst = (char*) dst;
  char* char_src = (char*) src;

  for (int i=0; i<n; i++) {
      *char_dst++ = *char_src++;
  }

  return dst;
}

一个简单的memcpy()实现

这是C/C ++中memcpy()的简单实现,它试图复制该函数的某些机制。

我们首先将srcdst类型转换为char *指针,因为我们不能取消引用void *指针。
" void *"指针仅用于在函数,线程之间传输数据,但不能访问它们。

现在我们可以逐字节直接复制数据,并返回" void *"目标地址。

##代码##

您可以通过用新函数替换memcpy()来验证是否将获得相同的输出。