内存函数| memcpy | memmove | memcmp |介绍及模拟实现

本文介绍了C语言中的内存函数memcpy、memmove和memcmp,详细讲解了它们的功能和用法,并通过实例展示了如何模拟实现这些函数。特别指出memcpy不处理重叠内存,而memmove则能正确处理重叠情况。同时,memcmp用于比较两块内存区域的内容并返回比较结果。
摘要由CSDN通过智能技术生成

目录

1.函数介绍:

1.1 memcpy

例子:

1.2 memmove

例子: 

 1.3 memcmp

 例子:

 2.函数模拟实现

 2.1 模拟实现memcpy

2.2模拟实现memmove


1.函数介绍:

1.1 memcpy

void * memcpy ( void * destination, const void * source, size_t num )

memcpy函数从source(源头)开始向后复制num个字节的数据到destination(目标)的内存位置。

这个函数遇到'\0'并不会停下来

如果source和destination有任何的重叠,复制的结果都是未定义的。

例子:

#include <stdio.h>
#include <string.h>

struct
{
  char name[40];
  int age;
} person, person_copy;

int main ()
{
  char myname[] = "Pierre de Fermat";
  /* using memcpy to copy string: */
  memcpy ( person.name, myname, strlen(myname)+1 );
  person.age = 46;
  /* using memcpy to copy structure: */
  memcpy ( &person_copy, &person, sizeof(person) );
  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
  return 0;
}

1.2 memmove

void * memmove ( void * destination, const void * source, size_t num )

memmove函数从source(源头)复制num个字节的数据到destination(目标)的内存位置。

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

如果源空间和目标空间出现重叠,就得使用memmove函数处理。

例子: 

#include <stdio.h>
#include <string.h>
int main ()
{
  char str[] = "memmove can be very useful......";
  memmove (str+20,str+15,11);
  puts (str);
  return 0;
}

 1.3 memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num )

比较从ptr1和ptr2指针开始的num个字节

返回值:

返回值                               表示
 <0 str1 小于 str2
 =0表示 str1 等于 str2
 >0表示 str2 小于 str1

 例子:

#include <stdio.h>
#include <string.h>
int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";
  int n;
  n = memcmp ( buffer1, buffer2, sizeof(buffer1) );
  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
  return 0;
}

 2.函数模拟实现

 2.1 模拟实现memcpy

//模拟实现memcpy
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	while (count--)//当count不等于0就进入循环
	{
		*(char*)dest = *(char*)src;//将dest和src强转换为char*,并且解引用
		((char*)dest)++;//dest地址向后移
		((char*)src)++;//src地址向后移
	}
}

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

2.2模拟实现memmove

//模拟实现memmove
#include <stdio.h>
#include <assert.h>
void *my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	if (dest < src)//当目标小于源头时,正序拷贝
	{
		while (count--)//count不等于0,进入循环
		{
			*(char*)dest = *(char*)src;//强制类型转换为char*,并且解引用
			((char*)dest)++;
			((char*)src)++;
		}
	}
	else//其他的时候,倒叙拷贝
	{
		while (count--)
		{
			*((char*)dest+count) = *((char*)src+count);
               //+count是为了让dest和src的地址变到最右侧
		}
	}
}

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

memmove会考虑内存覆盖重叠问题,模拟实现的时候也要做到

-- 本章完

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值