内存函数的模拟和使用

目录

1.memcpy使用和模拟

1.1使用

1.2模拟

 2.memmove使用和模拟实现

2.1使用

2.2模拟

3.memset函数的使用

3.1使用


1.memcpy使用和模拟

1.1使用

void *memcpy (void *destination,const void * sourece,size_t num);
从souce的位置开始向后复制num个字节的数据到destiantion指向的内存地址
函数遇到\0不停止
如果source和destination有重叠,结果未知

这里要记住,num这个参数是字节数,而一个整型数占4个字节,所以只会复制5个数字过去

1.2模拟

#include<stdio.h>
#include<assert.h>
void* memcpy1(void* dest, const void* src, size_t count)
因为可能是不同类型的数据复制,所以用void类型
{
	void* ret = dest;//方便返回
	assert(dest);//报错
	assert(src);
	while (count--)//因为count就是要复制的个数,所以直接count--即可
	{
		*(char*)dest = *(char*)src;
拷贝一个字节,
而char*类型只访问一个字节,所以这里要强制临时转换为char*类型
		dest = (char*)dest + 1;
		src = (char*)src + 1;
    这两条语句是为了向后走,注意强制转换类型,不然会跳未知的字节数
	}
	return ret;
}

 2.memmove使用和模拟实现

2.1使用

void * memmove(void * destination,const void *source,size_t num);
与memcpy的区别是memmove可以处理源地址和目标地址是可以重叠的
如果有重叠,不能用memcpy,得用memmove
虽然有时候标准库的memcpy可以处理重叠现象,但是不是所有编译器都能
因为memcpy标准上没有要求处理重叠内容

2.2模拟

#include<stdio.h>

void* memmove1(void* dest, const void* src,size_t count)
{
	void* ret = dest;
	if (dest <= src || (char*)dest >= ((char*)src + count))
//两种情况下,要从前向后拷贝,目标起始大于等于源地址或者在源地址之后
	{
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}

	}
	else
//剩下情况都从后向前拷贝
	{
		dest = (char*)dest + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}

int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove1(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

3.memset函数的使用

3.1使用

void * memeset(void * ptr,int value,size_t num);
设置内存,将内存中的值以字节为单位设置内容
不能改大于1个字节类型的数据

4.memcmp函数使用

4.1使用

int memcmp(const void * ptr1,const void * ptr2,size_t num);
比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
返回值大于0,则ptr1>ptr2
返回值小于0,ptr1<ptr2
返回值等于0,ptr1=ptr2
由于是内存比较,所以int类型有时候可以有时候不行

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值