目录
- 一、`memcpy`定义
- 1.`memcpy`在**cplusplus**中的定义
- 2.`memcpy`**复制内存块**
- 3.参数
- a.目的地
- b.源
- c.数字
- 4.函数返回值
- 5.函数头文件
- 二、`memcpy`的使用
- 使用`memcpy()`函数完成拷贝整型数组数据
- 三、memcpy的模拟实现
- 思路
- 代码
一、memcpy
定义
1.memcpy
在cplusplus中的定义
链接: link
2.memcpy
复制内存块
void * memcpy ( void * destination, const void * source, size_t num );
-
将
num
字节的值从源指向的位置直接复制到目标指向的内存块。 -
源指针和目标指针指向的对象的基础类型与此函数无关;结果是数据的二进制副本。
-
该函数不检查源代码中是否有任何终止
null
字符 - 它始终精确地复制num
字节。 -
为避免溢出,目标参数和源参数所指向的数组的大小应至少为
num
字节,并且不应重叠(对于重叠的内存块,memmove
是一种更安全的方法)。
3.参数
a.目的地
指向要复制内容的目标数组的指针,类型转换为 void*
类型的指针。
b.源
指向要复制的数据源的指针,类型转换为类型为 const void*
的指针。
c.数字
要复制的字节数。size_t是无符号整数类型。
4.函数返回值
函数的返回值类型是无类型指针(void*
),它的作用是在函数运行结束后返回拷贝后的目的地内存块的起始地址.
5.函数头文件
该函数包含在头文件<string.h>
中.
二、memcpy
的使用
使用memcpy()
函数完成拷贝整型数组数据
如下,我们使用memcpy()
函数将arr1
数组的前20字节(即前5个整形)拷贝进arr2
中:
分别给memcpy()函数传入3个参数:
目的地址arr2,数据源地址arr1,拷贝字节数
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
查看结果:
成功的将arr1中的前5个整形的数据拷贝进了arr2的前5个整形空间中.
三、memcpy的模拟实现
思路
- 1.首先传进函数中的目的地址和源地址指针都不能为
NULL
,如果为NULL
的话指针会发生越界访问问题所以在函数开始时用assert
断言dst
和src
- 2.因为我们要按照字节拷贝,传进来的数组可能为任意的类型,所以把数据强转为(
char*
)类型(因为char
类型在内存中占用1个字节) - 3.因为返回值是目的地址的起始位置的地址,所以我们移动
dst
指针前要提前记录目的地址的起始位置地址
代码
void * my_memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
/*
* 从低地址向高地址拷贝
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
查看结果
成功的将arr1
中的前20个字节拷贝到了arr2
中.
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持