栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言常用内存函数详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言常用内存函数详解

c语言常用内存函数详解

文章目录
  • c语言常用内存函数详解
      • 0、前言
      • 1、memcpy
        • memcpy的模拟实现
      • 2、memmove
        • memmove模拟实现
      • 3、memcmp
      • 4、memset
      • 5、总结

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 
#include 
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;
}

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

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

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

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

第一种:

从这种情况我们可以看到,我们需要把01234拷贝到23456所在的空间中,这个时候像下图这样从后向前一个个拷贝方可:

第二种:

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

第三种:

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

总结:

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

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

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

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

memmove模拟实现
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 

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;
}

运行结果:

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、总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019680.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号