IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c语言常用内存函数详解 -> 正文阅读

[C++知识库]c语言常用内存函数详解

c语言常用内存函数详解

0、前言

? 内存函数,即对内存中的内容进行一定的操作,通过这种函数,我们并不会局限与数据的类型,比如我我们希望将一个空间的内容拷贝到另一个空间中,如果是字符串我们可以用strcpy来解决,但其余数据类型strcpy就爱莫能助了,这时,我们就需要用到内存函数了,我们直接一个字节一个字节的拷贝过去,一样能达成我们想要的效果,并且不拘泥于具体的类型。下面我就为大家介绍这些常用的内存函数。

1、memcpy

void* memcpy(void* dest,const void* src,size_t num) 
{
}

让我们来看看memcpy这个函数,两个void* 的参数,让其能接收任意类型的指针,这个函数的意思就是把src指向的空间中num个字节的数据拷贝到dest指向的空间中。返回值是void* ,是目标空间的起始地址。

memcpy负责拷贝两块独立空间中的数据。

memcpy的模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dst, void* src, size_t num)
{
	assert(dst && src);     
	void* tmp = dst;
	while (num--) {                      
		*(char*)dst = *(char*)src;        //需要进行强制转换
		dst = (char*)dst + 1;            
		src = (char*)src + 1;
	}
	return tmp;
}
int main(void)
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr, sizeof(int)*5);
	for (int i = 0;i < 10;++i) {
		printf("%d ", arr2[i]);
	}
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VbsoxnOs-1658146265374)(C:\Users\2119869498\AppData\Roaming\Typora\typora-user-images\image-20220718105651684.png)]

注意:如果dst和src两者指向的内容重叠,其复制的结果是未定义的。下面的memmove则可解决这一问题。

2、memmove

void* my_memmove(void* dest, const void* src,size_t num)
{   
}

那么接下来就是想办法实现memmove的时候了,我们直到memcpy有时并不能够解决复制重叠的内容的问题,

接下来我们就需要好好讨论一下如何能够解决该种情况,然后再在上面代码的基础上进行改变,让我们能够模拟实现好memmove这个库函数,接下来我将分为三种情况来进行分析:

第一种:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGqsPrXY-1658146265375)(C:\Users\2119869498\AppData\Roaming\Typora\typora-user-images\image-20220718182413489.png)]

从这种情况我们可以看到,我们需要把01234拷贝到23456所在的空间中,这个时候像下图这样从后向前一个个拷贝方可:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C3ORzk6L-1658146265376)(C:\Users\2119869498\AppData\Roaming\Typora\typora-user-images\image-20220718182608643.png)]

第二种

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGY7SbEw-1658146265377)(C:\Users\2119869498\AppData\Roaming\Typora\typora-user-images\image-20220718182637125.png)]

这种情况我们可以看到,我们只需要把src指向的数据从前到后一个个拷贝到dst所指向的空间即可。

第三种:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXxSCQxU-1658146265378)(C:\Users\2119869498\AppData\Roaming\Typora\typora-user-images\image-20220718190006792.png)]

这种情况无论使用那种情况都可以。

总结:

src > dst -----> 需要从后向前进行拷贝

src< dst ------>需要从前向后进行拷贝

src= dst ------->无需进行操作

那么经过一番分析后,接下来我们就开始实现我们的代码吧!。

memmove模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>

void* my_memset(void* dst, void* src, size_t num)
{
	assert(dst && src);
	void* ret = dst;
	if (dst > src) {
		while (num--) {       //后置--,先使用再--,
			*((char*)dst + num) = *((char*)src + num);
		}
	}
	else if (dst == src) {    //相等时直接不进行操作
		;
	}
	else{
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return ret;
}

int main(void)
{
	int arr[] = {0,1,2,3,4,5,6,7,8,9};
	my_memset(arr + 2, arr, 20);

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

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52jx99df-1658146265379)(C:\Users\2119869498\AppData\Roaming\Typora\typora-user-images\image-20220718192146369.png)]

3、memcmp

int memcmp( const void *buf1, const void *buf2, size_t count )
{
}

memcpy函数就是将buf1指向的空间的内容一个字节一个字节与buf2所指向的空间中的内容进行比较,比较的字节个数为count。

返回值 :

Return ValueRelationship of First count Bytes of buf1 and buf2
< 0buf1 less than buf2
0buf1 identical to buf2
> 0buf1 greater than buf2

memcmp函数的模拟实现也足够简单,相信经过上面的模拟实现后这个应该会变得很轻松,这里就不过多赘述了。

4、memset

void *memset( void *dest, int c, size_t count )
{
}

memset有什么作用呢? memset会将dest所指向的空间的count个字节的内容初始化为c ,这个函数能让我们一个字节一个字节的初始化,使用起来有时会更加便利。

该函数的模拟实现也就不过多赘述了。

5、总结

到这里,常用的内存函数的介绍也就完了,希望大家都能从中汲取到有用的内容,感觉不错的可以帮忙点个赞哦。
`

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:19:47  更:2022-07-21 21:20:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 21:39:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码