c语言——内存操作函数

189 阅读2分钟

1 memcpy函数

原型:

char* memcpy(void* dest,const void* src,size_t count)

功能:

把src指向的内容拷贝到dest目标空间中去,但由于dest类型是void*,src类型是const void*,

size_t count是指要拷贝多少个字节;

(const使* src不能修改,当然解引用之前要强制类型转换,void*类型指针不能直接解引用)

所以可以拷贝任何类型的数据。以拷贝整型数据为例:

image.png

最后会返回目标空间的起始地址

实现方法:

image.png

void* my_memcpy(void* dest,const void* src, size_t count)
{
	assert(dest && src);
	//思路:将void*转换成char*,1个字节1个字节地拷贝
	void* re = dest;
	while (count)
	{
		*(char*)dest = *(char*)src;//必须强制类型转换,因为void*类型不能解引用
		dest = (char*)dest + 1;//要指定指针变量的具体类型才能+1
		src = (char*)src + 1;//void*可以接收任何类型的地址
		count--;
	}
	return re;
}

缺陷:

image.png

image.png

此时重叠部分的数字3已经被修改,所以memcpy不能有效处理重叠的内存拷贝

2 memmove函数

原型:

char* memmove(void* dest, const void* src, size_t count)

功能:

在memcpy的基础上,可以实现重叠内存拷贝.

image.png

改进:

为了防止在拷贝重叠部分之前,重叠部分已经被修改,

可以先拷贝重叠部分的内容,再拷贝非重叠部分的内容.

而重叠部分会出现在源地址内容的首部或尾部。

image.png

实现方法:

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	if (dest > src)
	{
		//从后向前拷贝,因为重叠部分只会出现在源空间尾部
		while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);
		}
		return dest;//dest并没有改变
	}
	else if (dest < src)
	{
		//从前往后拷贝,因为重叠部分只会出现在源空间首部
		void* re = dest;//这里dest会改变
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
		return dest;
	}
	else
	{
		//没有任何改变
		//自我拷贝
		return dest;
	}
}

3 memcmp函数

原型:

int memcmp(const void* buf1, const void* buf2, size_t count)

功能:

比较buf1和buf2开始的count个字节的内容

buf1 > buf2 返回>0的数字;

buf1== buf2 返回0;

buf < buf2 返回<0的数字.

image.png

4 memset函数

原型:

void* memset(void* dest, int c, size_t count)

功能:

把从dest开始的count个字节的内容都设成c.(以字节为单位初始化为c)

例:

image.png

设置前:

image.png

设置后:

image.png