C/C++ 常用内存操作函数的实现

1、
函数memcpy
原型void *memcpy(void *dest,void const *src,size_t length) 
功能:memcpy从src的起始位置复制length个字节到dest的内存起始位置
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针

void *memcpy(void *dest, void const *src, size_t length)
{
	assert(dest!=NULL && src!=NULL );
	assert((dest+length<=src)||(src+length<=dest));
	char *t = (char*)dest;
	const char *s = (char*)src;
	while (length--)
		*t++ = *s++;
	return dest;
}

2、
函数memmove
原型void *memmove(void *dest,void const *src,size_t length)
功能
:由src所指内存区域复制length个字节到dest所指内存区域
说明:src和dest所指内存区域可以重叠,但复制后src内容会被更改。函数返回指向dest的指针

void *memmove(void *dest, void const *src, size_t length)
{
	assert(NULL!=dest && NULL!=src);
	char *t = (char*)dest;
	char *s = (char*)src;
	if (t <= s || t >= s + length){
		while (length--)
			*t++ = *s++;
	}
	else {
		t = t + length - 1;
		s = s + length - 1;
		while (length--)
			*t-- = *s--;
	}
	return dest;
}

3、
函数memcmp
原型int memcmp(void const *buf1,void const *buf2,size_t length)
功能:比较内存区域buf1和buf2的前length个字节
说明:这些值按照无符号字符逐字节进行比较,函数的返回类型和strcmp函数一样----负值表示a小于b,正值表示a大于b,零表示a等于b。由于这些值是根据一串无符号字节进行比较的,所以如果memcmp函数用于比较不是单字节的数据如整数或者浮点数就可能出现不可预料的结果

int memcmp(void const *buf1, void const *buf2, size_t length)
{
	assert(buf1 != NULL && buf2 != NULL);
	const unsigned char *t = (char*)buf1;
	const unsigned char *s = (char*)buf2;
	int res;
	while (length--) {
		if ((res = *t++ - *s++) != 0)
			break;
	}
	return res;
}

4、
函数memset
原型void *memset(void *buffer,int ch,size_t length) 
功能:把从buffer所指内存区域的前length个字节设置为字符ch
说明:返回指向buffer的指针

void *memset(void *buffer, int ch, size_t length)
{
	assert(buffer != NULL);
	char *t = (char*)buffer;
	while (length--)
		*t++ = ch;
	return buffer;
}

5、
函数memchr
原型void *memchr(void const *buf,int ch,size_t length)
功能
:从buf所指内存区域的前length个字节查找字符ch
说明:当第一次遇到字符ch时停止查找。如果成功,返回指向字符ch的指针;否则返回NULL

void *_memchr(void const *buf, int ch, size_t length)
{
	assert(buf!=NULL);
	char *t = (char*)buf;
	while (length--) {
		if (*t == ch)
			return t;
		t++;
	}
	return NULL;
}

6、
函数bcopy
原型void bcopy(const void *src, void *dest, int n);
功能
:将字符串src的前n个字节复制到dest中
说明:bcopy不检查字符串中的空字节NULL,函数没有返回值

void bcopy(const void *src, void *dest, int n)
{
	char *tmp = (char*)dest;
	char *s = (char*)src;
	while (n--)
		*tmp++ = *s++;
}

7、
函数bcmp
原型int bcmp(const void *s1, const void *s2, int n);
功能
:比较字符串s1和s2的前n个字节是否相等
说明:如果s1=s2或n=0则返回零,否则返回非零值;bcmp不检查NULL

int bcmp(const void *s1, const void *s2, int n)
{
	if (s1 == s2 || n == 0)return 0;
	
	const char *t = (char*)s1;
	char *s = (char*)s2;
	
	do {
		if (*t++ != *s++)
			break;
	} while (--n);
	return n;
}

8、
函数bzero
原型void bzero(void *s, int n);
功能
:置字节字符串s的前n个字节为零
说明:bzero无返回值

void bzero(void *s, int n)
{
	char *t = (char*)s;
	while (n--)
		*t++ = 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值