【C语言】模拟实现memcpy、memmove、memset函数

memcpy原型

void* (void* dest,const void* src,size_t len)
为什么是void呢?,因为memcpy支持任何匀速类型的拷贝,所以给成void类型,然后在进行强制类型转化即可达到任意类型的拷贝。
这同样也是strcpy和memcpy的一个差别,这里mempy是对内存进行操作的所以无论你是什么类型,都可以对其进行操作。

memcpy模拟实现

void *my_memcpy(void *det, const void *src, int num)
 
{
    
    
 
char *p1 = (char *)det;
 
char *p2 = (char *)src;
 
char *ret = p1;
 
while (num)
 
{
    
    
 
*p1 = *p2;
 
p1++;
 
p2++;
 
}
 
return ret;
 
}

memmove函数原型

void* memmove(void *dst, const void *src, size_t count)

memcpy函数没有处理内存重叠的情况,所以引出了memmove函数来处理这个情况

memmove函数模拟实现

void* m_memmove(void* dest, const void* src, size_t len)
{
    
    
	assert(dest);
	assert(src);
	char* d = (char*)dest;
	char* s = (char*)src;
	char* res = d;
	if (d > s && d < s + len)
	{
    
    
		d = d + len;
		s = s + len;
		while (len--)
		{
    
    
			*d-- = *s--;
		}
	}
	else
	{
    
    
		while (*d++ = *s++)
		{
    
    
			;
		}
	}
	return res;
}

memset函数原型

void *memset(void *s, int ch, size_t n);
功能:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

突出优点:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

void* m_memset(void* src, int n, size_t len)
{
    
    
	int* s = (int*)src;
	int* temp = s;
	while (len--)
	{
    
    
		*s++ = n;
	}
	return temp;
}

memcmp函数原型

int memcmp(void* dest, const void* src,size_t len)

memcmp函数实现

int m_memcmp(void* dest, const void* src,size_t len)
{
    
    
	assert(dest);
	assert(src);
	char* d = (char*)dest;
	char* s = (char*)src;
	while (len--)
	{
    
    
		if (*d == *s)
		{
    
    
			d++;
			s++;
		}
		else
		{
    
    
			if (*d > *s)
				return 1;
			else
				return -1;
		}
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Vcrossover/article/details/114749526