与内存有关的函数(memcpy , memmove , memcmp , memset)

本文详细介绍了内存操作函数memcpy、memmove、memcmp和memset的基本用法及模拟实现。memcpy用于不重叠的内存拷贝,而memmove则能处理重叠情况。memcmp用于比较两块内存的字节序列,返回比较结果。memset用于设置内存区域的特定字节值。通过实例展示了这些函数的功能和使用场景。
摘要由CSDN通过智能技术生成

目录

一. memspy - 内存拷贝1

1.函数介绍

2.模拟实现

二.memmove - 内存拷贝2

1.函数介绍

2.模拟实现

三. memcmp -内存比较

四. memset - 内存设置

1.函数介绍

2.模拟实现


一. memspy - 内存拷贝1

1.函数介绍

void * memcpy ( void * destination, const void * source, size_t num );
  • 函数memcpysource的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 '\0' 的时候并不会停下来。
  • 如果sourcedestination有任何的重叠,复制的结果都是未定义的
  • 函数的两个参数都是void*类型的指针,因为不知道是什么类型的数据会进行拷贝,所以要可以接受任何类型的指针

2.模拟实现

//只要完成了不重叠的内存拷贝,就算完成了任务
void* my_memecpy(void* dest, const void* source, size_t num)
{
	assert(dest && source); 
	void* ret = dest;   //返回拷贝过后的空间

	while (num--)
	{
		*(char*)dest = *(char*)source;  //char是一个字节,指针转化为char* 一次访问一个字节
		dest = (char*)dest + 1;
		source = (char*)source + 1;
	}

	return ret;
}

二.memmove - 内存拷贝2

1.函数介绍

void * memmove ( void * destination, const void * source, size_t num ); 
  • memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

例如:我们想要 a b c d 拷贝到 c d e f上面去 结果为 a b a b c d  f  g 

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' };
	memcpy(str + 2, str , 4);
	return 0;
}

 但是实际的结果为  a b a b a b f g, 因为要拷贝 c d 的时候已经被前面的 a b 覆盖了,所以与预期的值不符,所以遇到区间重叠的时候我们要使用memmove函数进行操作。

2.模拟实现

void* my_memmove(void* dest, void* source, size_t count)
{
	
	    void* ret = dest;    //拷贝后返回
		assert(source && dest);
	
		if (dest < source)
		{
			//前->后
			while (count--)
			{
				*(char*)dest = *(char*)source;
				dest = (char*)dest + 1;
				source = (char*)source + 1;
			}
		}
		else
		{
			//后->前
			while (count--)
			{
				*((char*)dest+count) = *((char*)source + count);
			}
		}
	
		return ret;
}

三. memcmp -内存比较

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

 memcmp函数是一个用于比较两个内存块大小的函数。它会比较从buf1和buf2指针开始的count个字节,当buf1大于buf2的时候返回一个大于0的数;当buf1等于buf2的时候返回0;当buf1小于buf2的时候返回一个小于0的数。

使用:

#include<stdio.h>
#include<string.h> );
int main()
{
	int a[] = { 1, 2, 3, 4 };
	int b[] = { 1, 2, 4, 5 };
	int temp1 = memcmp(a, b, 8); // 0
	int temp2 = memcmp(a, b, 9); // 负数
	return 0;
}

 vs编译器采用小端存储模式

 

四. memset - 内存设置

1.函数介绍

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

memset函数可以将内存块的某一部分设置为特定的字符。第一个参数dest是开始设置内存的起始位置,第二个参数是要将内存设置成的字符,第三个参数是从起始位置开始需要设置的内存的字节数。

重点:

  • memset函数设置内存的时候是一个字节一个字节地设置的。
  • 实际内存块填装的是unsigned char类型的数据

2.模拟实现

void* my_memset(void* ptr, int val, size_t num)
{
	assert(ptr);
	for (int i = 0; i < num; ++i)
	{
		*((char*)ptr + i) = (char)val;
	}

	return ptr;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值