函数memcpy的实现及详解

       前言

        今天我们来了解一下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函数

        继续加油!!

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值