C语言内存函数

本文详细介绍了C语言中的memcpy,memmove,memset和memcmp四个内存操作函数的使用方法,包括它们的功能、示例以及模拟实现。重点讨论了内存重叠情况下的memmove处理策略。
摘要由CSDN通过智能技术生成

memcpy使用和模拟实现

memcpy使用

void * memcpy ( void * destination, const void * source, size_t num );
复制内存块
将 num 字节的值从源指向的位置直接复制到目标指向的内存块。

1.将num字节的值从源指向的位置直接复制到目标指向的内存块。

2.该函数不检查源代码中是否有任何终止 ‘\0’ 字符 - 它始终精确地复制 num 字节。

3.为避免溢出,目标参数和源参数所指向的数组的大小应至少为 num 字节,并且不应重叠(对于重叠的内存块,memmove 是一种更安全的方法)。

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

在这里插入图片描述

memcpy模拟实现

void* my_memcpy(void* dest, const void* sour, size_t num)
{
	assert(dest && sour);
	while (num--)
	{
		*(char*)dest = *(char*)sour;
		dest = (char*)dest + 1;
		sour = (char*)sour + 1;
	}
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 5 * sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

memmove使用和模拟实现

memmove使用

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

1.将num字节的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。
2.源指针和目标指针所指向的对象的底层类型与此函数无关;结果是数据的二进制副本。
3.该函数不检查源中是否有任何终止null字符——它总是精确地复制num个字节。
4.为了避免溢出,目的参数和源参数所指向的数组的大小至少为num字节。

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

	return 0;
}

在这里插入图片描述

memmove模拟实现

在这里插入图片描述

当原指针(source)的地址小于目标指针(destination)时,如果
从前往后复制,arr[2],arr[2]复制到arr[4],arr[5],arr[4],arr[5]会被复制成3、4,即arr[4] = 3,arr[5] = 4,此时要复制arr[4],arr[5]到arr[7],arr[8],arr[4],arr[5]已经不再是5、6。
在这里插入图片描述
因此从前往后方法行不通,我们就采用从后往前的方法。
在这里插入图片描述
这样需要的数字就不会被覆盖掉。
在这里插入图片描述
同理可以推出
当原指针(source)的地址大于目标指针(destination)时,我们采用从前往后的方法。
在这里插入图片描述

void* my_memmove(void* dest, const void* sour, size_t num)
{
	if (dest <= sour)
	{
		while (num--) {
			*(char*)dest = *(char*)sour;
			dest = (char*)dest + 1;
			sour = (char*)sour + 1;
		}
	}
	else
	{
		while (num--) {
			*((char*)dest + num) = *((char*)sour + num);
		}
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr +2 , arr , 5*sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

memset函数的使用

void * memset ( void * ptr, int value, size_t num );

memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

int main()
{
	char str[] = "hello world!";
	memset(str, 'x', 6);
	printf(str);
	return 0;
}

memcmp函数的使用

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

在这里插入图片描述

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值