memcpy内存拷贝函数

这篇具有很好参考价值的文章主要介绍了memcpy内存拷贝函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、memcpy内存拷贝函数

注意事项

二、memcpy与strcpy对比

三、模拟实现memcpy函数

四、memcpy函数不能进行两块存在内存重叠的空间的内存拷贝

五、改进my_memcpy函数


一、memcpy内存拷贝函数

头文件:string.h

函数原型:void* memcpy(void* destination , const void* source , size_t num)

函数作用:将源地址中num个字节的内容拷贝到目标地址中

参数分析:

void *是不指定具体类型指针,意味着该函数可以拷贝任意类型的数据

destination是目标地址,即将源地址的内容拷贝到目标地址中

source是源地址,为目标地址提供拷贝内容

num是拷贝多少个字节

实例代码1:两个数组空间的拷贝

char arr1[] = { 5,4,3,2,1 };
char arr2[] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(arr2, arr1, sizeof(arr1[0]) * 5);

for (int i = 0; i < 10; i++)
{
	printf("%d ", arr2[i]);
} 

memcpy内存拷贝函数,C/C++,c语言

实例代码2:destination和source不一定是数组,任意可读写的地址空间即可

char arr[20] = "abcdefg";
char* p = "123456789";
memcpy(arr + 2, p + 5, sizeof(char) * 4);

printf("%s\n", arr);

memcpy内存拷贝函数,C/C++,c语言

注意事项:

1.拷贝时destination地址的空间需要足够大,至少大于等于num个字节

2.如果destination地址空间存在数据,将会被新数据覆盖

3.memcpy不能进行有内存重叠的两个地址的内存拷贝

二、memcpy与strcpy对比

memcpy是内存拷贝函数,strcpy是字符串拷贝函数

strcpy函数原型:char *strcpy(char *str1, const char *str2)

strcpy函数作用:将字符串str2中的内容拷贝到字符串str1中

对比memcpy函数:

1.memcpy函数逐字节拷贝,strcpy函数遍历str2时遇到\0即停止拷贝,并将\0也拷贝到str1中

2.memcpy函数可以拷贝任意类型数据,strcpy函数只能拷贝字符串

三、模拟实现memcpy函数

注意:优先级:后置++  >  强制类型转换,所以destination和source的强制类型转换需要加括号

void* my_memcpy(void* destination, const void* source, size_t num)
{
	if (destination == NULL || source == NULL)
	{
		return NULL;
	}
	for (int i = 0; i < num; i++)
	{
		*(char*)destination = *(char*)source;

		((char*)destination)++;
		((char*)source)++;
	}
}

实例代码:

char arr[] = "123456789";
memcpy(arr, arr + 5, 3);
printf("%s\n", arr);//678456789

memcpy内存拷贝函数,C/C++,c语言

四、memcpy函数不能进行两块存在内存重叠的空间的内存拷贝

VS改进后的memcpy函数可以进行内存重叠空间的拷贝:

C语言标准规定,memcpy函数不能进行两块有内存重叠的的空间的内存拷贝,但是在VS编译器下实际测试时,这是由于VS对memcpy函数进行了改进,使得其可以进行内存重叠的空间的拷贝。

char arr[] = "123456789";
memcpy(arr + 2, arr, 5);//121234589
printf("%s\n", arr);

memcpy内存拷贝函数,C/C++,c语言

模拟实现的my_memcpy函数不能进行内存重叠空间的拷贝:

但是当使用模拟实现的my_memcpy函数进行拷贝时,结果不尽人意……

结果并非预期的121234589,而是121212189

	char arr[] = "123456789";
	my_memcpy(arr + 2, arr, 5);//121234589
	printf("%s\n", arr);

memcpy内存拷贝函数,C/C++,c语言

原因分析:

这是因为在进行内存重叠的两块空间拷贝时,会发生未拷贝的被已拷贝的数据覆盖

例如:将源空间的12345,拷贝到目标空间的34567

当1、2拷贝到3、4的位置时,数组变为121256789,源空间需要拷贝的3、4被1、2覆盖,无法进行拷贝,只能再将1、2拷贝到目标空间,显然这是错误的

memcpy内存拷贝函数,C/C++,c语言

五、改进my_memcpy函数

解决上述问题,需要改进的my_memcpy函数的算法

将拷贝的类型分为两类:1.源空间在目标空间前  2.目标空间在源空间前

1.源空间在目标空间前

如下图,常规方法从前向后拷贝(1~3,2~4,……),需要改进为从后向前拷贝(5~7,4~6,……),这样被覆盖的数据已经拷贝完了 ,不影响后续的拷贝

memcpy内存拷贝函数,C/C++,c语言

2.目标空间在源空间前

如下图,需要从前向后拷贝(3~1,4~2,……)

memcpy内存拷贝函数,C/C++,c语言

总体原则:第一次拷贝的空间不能覆盖源空间

改进后的my_memcpy函数:

void* my_memcpy(void* destination, const void* source, size_t num)
{
	if (destination == NULL || source == NULL)
	{
		return NULL;
	}
	if (source < destination)//从后向前拷贝
	{
		for (int i = num - 1; i >= 0; i--)
		{
			*((char*)destination + i) = *((char*)source + i);
		}
	}
	else//从前向后拷贝
	{
		for (int i = 0; i < num; i++)
		{
			*(char*)destination = *(char*)source;
			((char*)destination)++;
			((char*)source)++;
		}
	}
}

测试代码:

char arr[] = "123456789";
my_memcpy(arr + 2, arr, 5);//121234589
printf("%s\n", arr);

memcpy内存拷贝函数,C/C++,c语言文章来源地址https://www.toymoban.com/news/detail-722994.html

到了这里,关于memcpy内存拷贝函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】内存函数memcpy和memmove的功能与模拟实现

    1.memcpy 功能:把source指向的前num个字节内容拷贝到destination指向的位置去,可以拷贝任意类型的数据。 注:1.memcpy并不关心\\0,毕竟传的也不一定是字符串,因此拷贝过程中遇到\\0也不会停下来。 2.num的单位是字节,并不是要拷贝的元素个数 3.如果source和destination有任何的重叠

    2024年02月19日
    浏览(40)
  • 【C语言内存函数精选】memcpy、memset、memmove及仿真实现!掌握内存操作的艺术!

    ❤️ 博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 我的努力求学没有得到别的好处,只

    2024年02月15日
    浏览(39)
  • 【C语言】memcpy memmove memset memcmp 四大内存操作函数(详解+用法+模拟实现)

    头文件string.h中常用内存操作函数共有四大,学习完本篇文章,各种类型数组的常见处理轻松拿下。 对字符串(字符数组)的操作函数有很多,但是我们想要操作整型数组等呢: 这就需要内存操作函数了, memory在计算机科学中是内存的意思 ,这也是四大内存操作函数都有mem头

    2024年02月10日
    浏览(47)
  • 来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp

    今天又来写一篇C的文章,这里要讲的是C语言中的几个内存函数,主要是讲解功能和用法,望能耐心观看哦。望官方也多多曝光。 目录 memcpy  memmove memset  memcmp  memcpy  是 C 语言标准库中的一个函数,用于复制内存块的内容。它的主要作用是将一个源内存区域的内容复制到

    2024年02月22日
    浏览(44)
  • 【C语言】memmove()函数(拷贝重叠内存块函数详解)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.memmove()函数简介 1.函数功能 2.函数参数 1.void * destination 2.onst void * source 3.size_t num 3.函数返回值 4.函数头文件 二.memmove()函数的具体使用 1.使用memmove()函数完成拷贝整型数组数据(目的地与源重

    2024年02月06日
    浏览(38)
  • C语言内存操作函数,memcpy的使用和模拟实现,memmove的使用和模拟实现,memcmp的使用,memset的使用。

    函数原型: void *dest 目标数据首元素地址 const void *src 源数据(需要拷贝过去的数据) size_t count 需要拷贝数据的字节大小 void *memcpy 拷贝结束后,返回目标数据的起始地址 函数作用: 拷贝 count 个字节的数据从源数据起始地址到目标空间。 函数的使用 函数的模拟实现: 注:

    2024年02月09日
    浏览(44)
  • 【C语言】memcpy,memmove,memcmp,memset函数详解

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 #includestring.h 与strn

    2024年02月17日
    浏览(34)
  • 【C++】vector问题解决(非法的间接寻址,迭代器失效 , memcpy拷贝问题)

    送给大家一句话: 世界在旋转,我们跌跌撞撞前进,这就够了 —— 阿贝尔 加缪 我们之前实现了手搓vector,但是当时依然有些问题没有解决: 迭代器区间拷贝(非法的间接寻址问题) 迭代器失效问题 使用memcpy拷贝问题 接下来,我们一点一点来解决这些问题!!! 来看这个

    2024年04月09日
    浏览(55)
  • 【C语言】strcpy()函数(字符串拷贝函数详解)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.strcpy()函数简介 1.函数功能 2.函数参数 1.char * destination 2.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用strcpy()函数完成字符数组间的字符拷贝 2.使用strcpy()函数完成

    2024年02月03日
    浏览(49)
  • C++实现memcpy函数

    功能:memcpy为按字节拷贝内存函数,从源src所指的内存地址开始拷贝n个字节到目标dest为起始地址的内存中。 返回值:函数返回指向目标内存区dest的指针。 注意事项: memcpy应该实现按字节拷贝指定长度的内存内容,但若传入函数的实参dest和src指针的类型不同,直接自增++可

    2024年02月16日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包