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)
头文件 <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()
的简单实现,它试图复制该函数的某些机制。
我们首先将src
和dst
类型转换为char *
指针,因为我们不能取消引用void *
指针。
" void *"指针仅用于在函数,线程之间传输数据,但不能访问它们。
现在我们可以逐字节直接复制数据,并返回" void *"目标地址。
##代码##您可以通过用新函数替换memcpy()
来验证是否将获得相同的输出。