当前位置: 首页 > 工具软件 > X-Mem > 使用案例 >

mem系列函数的实现

宋洲
2023-12-01

mem系列函数的实现

大家都知道 ,c语言中有一系列的字符串操作函数(如果你不清楚,过来看这里   字符串函数解析)。
但是这些函数仅限作用于字符 串 ,因为这些函数,都是以'\ 0'作为结束条件的 ,'\ 0'的ascll值是 0 ,所以  如果操作
数组的话 ,就会有一个问题 ,只要遇到 0就会停止 。所以 不行  。
所以在此处 ,就提出了内存操作函数  memory
内存操作函数   ,我知道的
包括:
memcpy内存拷贝函数 
memove内存移动函数
memset内存设置函数

1、memcpy内存拷贝函数 

void *memcpy( void *dest, const void *src, size_tcount);
memcpy函数 的参数 类型  void*       const void *     size_t    什么意思?
就是 参数类型为 无类型指针 ,表示什么样的 类型都适用  所以 void*  又被称为万能指针
但是有一点要记住 ,就是 不要对于 void * 的指针进行加减操作,
因为它是无类型 ,所以每个指针 移动时 ,不知道地址的偏移量。
因此,操作时一般转换为char类型的指针 ,因为大小为1字节,操作的空间单位大小也是 1字节 
count表示要操作的空间大小 ,单位是字节 。size_t表示无符号整型  
代码实现
void *My_memcpy(void *dest ,const void *src,size_t num)//将src拷贝到dest上 ,num为空间大小 size_t表示的是无符号整型
{
	void *ret =dest;//void * 表示的是无类型的指针 ,可以接受任何类型的指针,又称万能指针
	char *pdest = (char *)dest;//将指针转化成char* ,是因为char类型的空间字节数为1 
	char *psrc  = (char *)src;
	assert(dest);
	assert(src);
	while(num--)//判断空间是否结束
	{
		*pdest++ = *psrc++;
	}

	return ret;
}

2.memove内存移动函数

memove函数和 memcpy函数 其实有很多 的共同之处  ,可以说 memove函数 是 memcpy函数的一个拓展
因为 内存移位时会出现重叠现象  
比如 :
数组arr[10]={0,1,2,3,4,5,6,7,8,9};
将入你要将 arr[3]位置向后3字节空间  移动   到arr[4]向后 3字节的空间 
最后 ,输出的数组应该是  0  1  2  3  3  4  5   7  8  9  
但是 ,你要是用 memcpy函数  就会遇到一个问题  从前开始拷贝 时到 arr[4]位置是  空间的内容已经改变 了 
所以 ,要从后向前拷贝 
memove函数就是会在此处对于  从前拷贝还是从拷贝 ,做了一次判断
代码实现
void *My_memmove(void *dest ,const void *src,size_t num)//将src拷贝到dest上 ,num为空间大小 size_t表示的是无符号整型
{	
	void *ret =dest;
	char *pdest = (char *)dest;
	char *psrc  = (char *)src;
	assert(dest);
	assert(src);
	if(pdest > psrc)//判断是否需要从后往前移位
	{
		while(num--)//从后向前 空间减少  知道为 0
		{
			*(pdest+num)=*(psrc+num);
		}	
	}
	else//从前拷贝
	{
		while(num--)
		{
			*pdest++ = *psrc++;
		}
	
	}
	return ret;
}



 

3.memset 内存设置函数 

 
  这个函数的作用就是在一段空间里 ,放上自己所要放的  值 
应用到 程序里的意思就是 为一段空间 赋初值  
void *memset( void *dest, intc, size_tcount );
返回值 为 空间首地址  c表示要初始的值 ,count表示的是空间大小  
这个函数 ,还可以 用来将 一个空间 清零 
下次如果要 将
某段空间赋初值 ,可以使用这个函数
代码实现
void *My_memset(void *dest, int c, size_t count )//dest 表示要初始化空间的首地址 
{

	void *ret =dest;
	char *str =(char *)dest;
	size_t i= 0 ;
	assert(dest);
	for(i = 0 ;i< count ;i++)
	{
		*(str+i) = c;	//将每个位置都给c
	}
	return ret;
}
这篇博客是 草草写的 ,不是很好,大家多包涵 !!!!

如果了解memcpy与strcpy函数区别 ,过来看这里


 类似资料: