C语言《超详细解析内存函数》

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

内存函数

一、memcpy函数

(1)、函数内容解析

memcpy指的是C使用的内存拷贝函数。
函数原型:

在这里插入代码片void * memcpy(void * de, const void * sr, size_t num)

(一)、参数:
de:指向用于存储内容的目标数组,类型强制转换为void指针。
sr:指向要复制的数据源,类型强制转换为void
指针
n:要被复制的字节数。
为什么要使用void* ,当传参的时候我们不知道传的是什么类型,而void就像一个垃圾桶,可以接受任何的类型,例如整型,浮点型,字符型等。
(二)、返回值:
该函数返回一个指向目标存储区de的指针。
(三)、功能:
从源sr所指的内存地址起始位置开始拷贝n个字节到目标de所指的内存地址的起始位置中。
(四)、所需头文件:
C语言;#include<string.h>
(五)、函数实现:
如图:memcpy函数怎么理解,c语言,c++
运行结果:
memcpy函数怎么理解,c语言,c++

(2)、memcpy模拟实现

memcpy函数怎么理解,c语言,c++
模拟函数内容解析:
1、把源a2内容6个数拷贝到目标a1数组中,也即24个字节。2、模拟函数中的参数和原型中保持一致,使之更规范。
3、在模拟函数中,先把目标数组起始地址存到一个变量中,便于我们返回,因为函数类型是void*,变量类型也是void*。
4、在while循环中,我们需要一个字节一个字节去拷贝,要把源地址和目标地址转换为字符型,它是一个字节,之后再解引用进行拷贝,一个字节拷完之后还需拷下一个字节,所以先转为字符型指针再加1,直到num字节数为0停止。
模拟函数运行结果如下:
memcpy函数怎么理解,c语言,c++

(3)、memcpy函数说明

1、sr和de所指的内存区域可能重叠,但是如果sr和de所指的内存区域重叠,那么这个函数不能确保sr所在重叠区域在拷贝之前不被覆盖。这个问题我们可以接下来介绍的memmove去解决重叠区域。
2、如果目标de本身已有数据,执行memcpy后,将覆盖原有数据,如要追加数据,则每次执行完后,要将目标数组地址增加到你要追加数据的地址。

二、memmove函数

(1)、memmove内容解析

memmove也是用于拷贝字节,memmove和memcp内容基本一样,但用法有些不同。
(1)、函数实现:
如图:
memcpy函数怎么理解,c语言,c++

运行结果:
memcpy函数怎么理解,c语言,c++

(2)、memmove模拟实现

memcpy函数怎么理解,c语言,c++

memcpy函数怎么理解,c语言,c++
模拟函数内容解析:
1、把源a数组从起始地址开始5个数(20个字节)拷贝到目标a数组地址从a+2处也即使第三个元素开始的数组中。
2、模拟函数中的参数类型和原型中保持一致,使之更规范。
3、在模拟函数中,先把目标数组起始地址存到一个变量中,便于我们返回,因为函数类型是void*,变量类型也是void*。并断言一下指针变量便于找错。
4、在while循环中,存在一些细节:
当在自身数组里拷贝时候:
(1)、当目标地址de小于源地址sr时:我们把sr中的内容从前往后一个字节一个字节去拷贝,如果从前往后,会被覆盖掉产生五个数中最后两个数字的循环。所以先要把源地址和目标地址转换为字符型,它是一个字节,之后再解引用进行拷贝,一个字节拷完之后还需拷下一个字节,所以先转为字符型指针再加1,直到num字节数为0停止。
(2)、当目标地址de大于源地址时:我们要把sr中的内容从后往前拷贝,如果从前往后就如上例,会出现 1,2,1,2,1,2,1,8,9,10,会把3,4,5覆盖掉,所以从后往前拷贝,在while循环中,把de和sr先转换为char*1字节,再加上已经减去1的num再解引用就是五个数中最后一个字节,止到num减为0结束。
模拟函数运行结果如下:
memcpy函数怎么理解,c语言,c++

(3)、memmove函数说明

如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改,但是当目标区域和源区域没有重叠,则和memcpy函数功能相同

三、memcmp函数

(1)、memcmp函数内容

该函数是比较字节的
函数原型:
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
(一)、参数:
ptr1:指向内存块的指针。
ptr2:指向内存块的指针
num:要被比较的字节数
(二)、功能:
比较内存区域ptr11和ptr2前num个字节
(三)、返回值:
如果返回值<0,则表示ptr1小于ptr2.
如果返回值>0,则表示ptr2小于ptr1
如果返回值=0,则表示ptr1等于ptr2
(四)、头文件:
#include<string.h>
(五)、函数实现:
memcpy函数怎么理解,c语言,c++
运行结果:
memcpy函数怎么理解,c语言,c++

(2)、memcmp模拟实现

memcpy函数怎么理解,c语言,c++
模拟函数内容解析:
1、比较a1数组和a2数组前9个字节的大小。
2、模拟函数参数类型和原型保持一致,使用void* ,当传参的时候我们不知道传的是什么类型,而void就像一个垃圾桶,可以接受任何的类型,例如整型,浮点型,字符型等。
3、因为是一个字节一个字节比较,用for循环,循环num次即可。
4、在for循环嵌套一个if语句来判断是否相等,先把ptr1和ptr2转为一字符类型,即char*类型,再解引用比较大小,如果相等就++,如果不能直接返回两个字节的差值。
5、当num循环完之后,说明比较的字节内容都相等,就返回0。
模拟函数运行结果如下:
memcpy函数怎么理解,c语言,c++

(3)、memcmp函数说明

它是按字节比较的,传过去多少字节,就比较多少。对比是以字节为单位,strcmp时以字符为单位。

四、memset函数

(1)、 memset内容解析

它是C语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值。
函数原型:
void* memset(void* s,int ch,int n)
(一)、参数
s:是数组首元素地址
ch:被设的值
n;被设值的字节个数
(二)、返回值:
该函数返回一个指向s的指针。
(三)、功能
将某一块内存中的内容全部设置为指定的值。
(四)、头文件
#include<string.h>
(五)、函数实现:
memcpy函数怎么理解,c语言,c++
运行结果:
memcpy函数怎么理解,c语言,c++

(2)、memset模拟实现

memcpy函数怎么理解,c语言,c++

模拟函数内容解析:
1、把数组前12个字节初始化为0
2、断言一下指针,方便检查在第几行出错
3、用热帖保存s的起始地址
4、用一个for循环,循环num次停止,在里面设置值,把s先强制转换char*进行赋ch,之后指针再加1即可。
模拟函数运行结果如下:
memcpy函数怎么理解,c语言,c++

(3)、memset函数说明

memset函数按字节对内存进行初始化,所以它不能用它将int数组初始化为0或-1之外的其他值。文章来源地址https://www.toymoban.com/news/detail-630416.html

五、模拟库函数实现源代码

(1)、memcpy源代码

#include<stdio.h>//模拟实现memcpy内存函数
void* my_memcpy(void* de,void* sr,int num)
{
	void* ret = de;
	while (num--)
	{
		*(char*)de = *(char*)sr;
		de = (char*)de + 1;
		sr = (char*)sr + 1;
	}
	return ret;
}
int main()
{
	int a1[9] = { 1,2,3};
	int a2[6] = { 4, 5, 6, 7, 8, 9 };
	my_memcpy(a1, a2, 24);
	for (int i= 0; i < 6; i++)
	{
		printf("%d", a1[i]);
	}
	return 0;

}

(2)、memmove源代码

在这里插入代码片#include<stdio.h>
#include<assert.h>//模拟实现memmove
void* my_memmove(void* de,void* sr,int num)
{
	assert(de&&sr);
	void* ret = de;
	if (de < sr)
	{
		while (num--)
		{
			*(char*)de = *(char*)sr;
			de = (char*)de + 1;
			sr = (char*)sr + 1;
		}
	}
	else if (de>sr)
	{
		while (num--)
		{
			*((char*)de + num) = *((char*)sr + num);
		}
	}
	return ret;
}
int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	my_memmove(a+2 , a, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

(3)、memcmp源代码

在这里插入代码片#include<stdio.h>//模拟实现memcmp函数
int my_memcmp(const void * ptr1, const void * ptr2, int num)
{
	for (int i = 0; i < num; i++)
	{
		if (*((char*)ptr1) == *((char*)ptr2))
		{
			ptr1 = (char*)ptr1 + 1;
			ptr2= (char*)ptr2 + 1;
		}
		else
		{
			return *((char*)ptr1) - *((char*)ptr2);
		}
	}
	return 0;
}
int main()
{
	int a1[] = {1,2,3};
	int a2[] = {1,2,4};
	int ret = memcmp(a1, a2,9);
	printf("%d\n", ret);
	return 0;
}

(4)、memset源代码

在这里插入代码片#include<stdio.h>//memset模拟实现
#include<assert.h>
void* my_memset(void* s, int ch, int n)
{
	assert(s);
	void* ret = s;
	for (int i = 0; i < n; i++)
	{
		*((char *)s) = ch;
			s = (char*)s + 1;
	}
	return ret;
}
int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6 };
	my_memset(a, 0, 12);
	for (int i = 0; i < 6; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

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

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

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

相关文章

  • C语言《超详细解析内存函数》

    memcpy指的是C使用的内存拷贝函数。 函数原型: (一)、参数: de:指向用于存储内容的目标数组,类型强制转换为void 指针。 sr:指向要复制的数据源,类型强制转换为void 指针 n:要被复制的字节数。 为什么要使用void* ,当传参的时候我们不知道传的是什么类型,而void就像

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

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

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

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

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

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

    2024年02月09日
    浏览(37)
  • memcpy内存拷贝函数

    目录 一、memcpy内存拷贝函数 注意事项 二、memcpy与strcpy对比 三、模拟实现memcpy函数 四、memcpy函数不能进行两块存在内存重叠的空间的内存拷贝 五、改进my_memcpy函数 头文件: string.h 函数原型: void* memcpy(void* destination , const void* source , size_t num) 函数作用: 将源地址中num个字节

    2024年02月07日
    浏览(30)
  • 【c++中内存拷贝函数(C++ memcpy)详解】

    原型 :void*memcpy(void*dest, const void*src,unsigned int count);  功能 :由src所指内存区域复制count个字节到dest所指内存区域。   说明 :src和dest所指内存区域不能重叠,函数返回指向dest的指针。     举例 :  下面自行实现这个函数 程序清单 1 V0.1版程序  程序清单 2 测试V0.1用例   

    2023年04月20日
    浏览(24)
  • c语言内存函数的深度解析

      本章对  memcpy,memmove,memcmp  三个函数进行详解和模拟实现; 本章重点:3个常见内存函数的使用方法及注意事项并学会模拟实现; 如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!!! 1.memcpy函数

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

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

    2024年02月17日
    浏览(23)
  • 【C语言】内存函数的详细教学和模拟实现

    🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠ 📝个人主页:gugugu—精品博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:gugugu的精品博客 ✉️

    2024年02月07日
    浏览(26)
  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

    今日分享:字符、字符串函数和内存函数 内存函数 就是对内存进行操作的函数 字符串函数 就是对字符串进行操作的函数 字符函数 就是对字符进行操作的函数 str 前缀的函数是字符串函数,头文件string.h mem 前缀的函数是内存函数,头文件stdlib.h 字符分类函数包含在 ctype.h 头

    2024年03月18日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包