前言
今天我们来了解一下memcpy函数和它的作用吧,咋们之前已经熟悉了strcpy的使用,它的作用是字符串的拷贝,那么当我们要拷贝其他类型的数据时,应该使用什么函数呢,我们今天给大家介绍的就是memcpy函数,他可以实现字符串以外其他数据的拷贝,没有strcpy函数只能拷贝字符串的局限性。
了解memcpy函数
memcpy:他是C和C++标准库中的一个函数,用于内存操作。它的作用是在内存中复制一块数据从一个位置到另一个位置。
memcpy的函数原理
我们可以看到memcpy函数的官方解释中说,在缓冲区之间复制字符,这就是memcpy与strcpy的区别之处,strcpy只能复制字符串。
memcpy的返回值是指向目标内存区域dest的指针,这里为空指针,因为他也不知道自己会返回什么类型的数据,可能是int类型,可能是char类型都不一定,因为我们不知道内存中存放的是什么类型的数据。
指针dest:指向目标内存位置的指针,即数据将要被复制到的位置。指针src:指向源内存位置的指针,即数据将要被复制出来的位置。一共复制count个字节。
简单来说就是memcpy函数会从src指向的地址开始,复制count个字节到dest所指向的地址。
函数使用时的注意事项
在我们使用memcpy函数的时候有这么几点需要注意
1.这个函数在遇到‘\0’的时候不会停下来
2.确保目标地址和源地址指向的内存区域是有效且已经分配的
3.如果src和dest有任何重叠,复制的结果都是未定义的。
我们了解了memcpy来试着写一个自己的memcpy函数吧
代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 20);
int i;
for (i = 0;i < 10;i++)
printf("%d ", arr2[i]);
return 0;
}
代码解析
我们创建两个数组arr1和arr2,我们将数组arr1中的数据复制到arr2中,之前咋们了解了数组名是数组首元素的地址,我们将数组名直接传参就可以,我们复制20个字节到数组arr2中。一个整型数据为4个字节,这里就是复制5个数字到arr2数组中。
我们来实现memcpy函数,首先使用断言assert函数确保指针dest与指针src不为空指针,我们使用while循环来进行数据的复制,首先我们要拷贝的内容单位为字节。
我们使用整型来拷贝,不行,我们整型指针拷贝可能实用与当前举例,但是在面对其他的数据类型是不行的,这里我们要使用char*,每次复制一个字节,这样就不会出问题。
我们将src解引用拿到指针所指向内存的数据(*src),之后我们强制类型转化为char*。
之后要注意了,大家是不是在指针偏移的时候喜欢写成(char*)dest++,这里是会出问题的,因为这样写的时候这种强制类型转换是临时的,他没有彻底改变dest的类型,这样写的时候dest的类型还是void*,我们将他写成 dest=(char*)dest+1的方式就没问题。
这段程序我们需要执行num次才可以完成数据的拷贝,这里我们就使用while循环,条件为num--。
我们创建一个指针ret来接收dest的地址,最后将ret返回就可。
运行结果
当然它也是有缺陷的,就如同我们之前提到的,如果src和dest有重叠,那么我们拷贝的结果会出问题,需要使用到另一个函数memmove。这个函数咋们今天就不接着说喽,如果感兴趣可以点击链接查看哦。
memmove函数
继续加油!!