【C库函数】memcpy函数详解

简介: 【C库函数】memcpy函数详解

memcpy

       拷贝内存块到目标空间

函数原型

void*memcpy(void*dest,constvoid*src,size_tcount);

参数讲解

参数 dest src count
解析 目标空间地址 要拷贝内容空间源地址 拷贝内容字节数

返回值讲解

返回目标空间的起始地址

函数讲解

       memcpy函数不像strncpy函数一样只能拷贝字符,memcpy函数可以拷贝任意类型的内容

具体使用如下

当使用时我们要注意三个点

1、 我们一定要注意memcpy第三个参数传的是要传内容的字节数

以上面为例,我们想把arr1中前五个元素传中arr2,在memcpy就要写20。为什么呢?因为arr1为整型数组,其中包含的元素也是整型,是4个字节。而我们要传递五个整型,所以就是4*5个字节

2、目的空间大小一定要能容纳memcpy所拷贝的内容

如果拷贝在内容超过目的空间大小,那么就会溢出 编译器会报出警告


3、尽量避免dest和src所指向的地址有内存重叠的部分

例如:我们想把arr1中1、2、3分别拷贝到3、4、5的位置时,就出现了内存重叠的现象

int main()
{
  int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
  memcpy(arr1 + 2, arr1, 12);
  return 0;
}

9f4380d4e33ba6112fe3f489e628553c_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

上述代码意思是想像图1一样,把1、2、3分别拷贝到3、4、5的位置。但是现实情况确实图2那样,因为当第一个位置中的“1”拷贝到3的位置时,“3”这个数就被替换成1,当轮到第三个位置拷贝时,就会拷贝“1”而不是“3”。


这种就是内存重叠可能出现的情况,但是现在memcpy好像解决了重叠拷贝的问题,我在vs2019和ubuntu上测试的时候,memcpy竟然没有出错!


       也许是memcpy函数有了新的改进,但是大家平常还是应该注意在使用memcpy时避免内存重叠的情况。

在vs2019上运行截图

在 ubuntu上运行截图

 

我们在使用时也会有一些使用技巧如下,当我们想把arr1中的3、4、5、6拷贝到arr2中去时,我们可以这样写

memcpy(arr2, arr1 + 2, 16);

006147fd8e90df4cdce536d5fe2d7f33_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aiB5aiB5rKB5rKB,size_20,color_FFFFFF,t_70,g_se,x_16.png

到这memcpy函数就讲解完了,如果大家想模拟实现memcpy函数的话


可以参考这篇文章:模拟实现memcpy库函数


相关文章
|
C语言
【C语言】memcpy函数和memmove函数使用和模拟实现
【C语言】memcpy函数和memmove函数使用和模拟实现
83 0
|
6月前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
6月前
|
存储 算法 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)
`memcpy()` 和 `memmove()` 是C语言中的两个内存操作函数。 `memcpy()` 函数用于从源内存区域复制指定数量的字节到目标内存区域。它不处理内存重叠的情况,如果源和目标区域有重叠,结果是未定义的。函数原型如下: ```c void *memcpy(void *dest, const void *src, size_t num); ```
220 6
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
62 0
|
6月前
|
存储 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (二)
`memset()`是一个C语言库函数,用于将指定内存区域的字节设置为特定值。函数原型为`void *memset(void *ptr, int value, size_t num)`,参数分别为指向内存起始位置的指针、要设置的值和设置的字节数。`memcmp()`函数则用于比较两个内存区域,返回值表示比较结果,原型为`int memcmp(const void *ptr1, const void *ptr2, size_t num)`。它比较指定字节数的内存,并根据比较结果返回整数值。
85 4
|
6月前
|
C语言
C语言实现memcpy,memmove
C语言实现memcpy,memmove
53 0
|
存储 安全 编译器
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
【C语言】memcpy,memmove,memcmp,memset函数详解
|
6月前
|
算法 编译器 C语言
memcpy内存拷贝函数
memcpy内存拷贝函数
99 0
|
6月前
|
C语言
C语言零基础教程(memset,memcpy函数,memmove函数)
C语言零基础教程(memset,memcpy函数,memmove函数)
314 0