内存函数memcpy、mommove、memset、memcmp

目录

1、memcpy函数

memcpy函数的模拟实现

2、memmove函数

memmove函数的模拟实现

3、memset函数

4、memcmp函数


1、memcpy函数

描述:

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1

声明:

cpp 复制代码
void *memcpy(void *str1, const void *str2, size_t n)

参数:

  • str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  • str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
  • n -- 要被复制的字节数。

返回值:

该函数返回一个指向目标存储区 str1 的指针。

用法:

cpp 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	memcpy(arr2, arr1, 20);
	//20 字节数
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	

结果:

memcpy函数的模拟实现

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <assert.h>

void* my_memcpy(void* str1, void* str2, size_t n)
{
	void* ret = str1;
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (n--)
	{
		*(char*)str1 = *(char*)str2;//将str2的字符赋给str1
		str1 = (char*)str1 + 1;//跳到下一个字节
		str2 = (char*)str2 + 1;//跳到下一个字节
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 20);
	//20 字节数
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

这里不能写成str1++,因为str1是void*指针。也不能写成(char*)str1++,因为强转是临时的,但是可以这样写,((char*)str1)++。

结果:

2、memmove函数

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

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

描述:

C 库函数 void *memmove(void *str1, const void *str2, size_t n)str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

声明:

cpp 复制代码
void *memmove(void *str1, const void *str2, size_t n)

参数:

  • str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
  • str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
  • n -- 要被复制的字节数。

返回值:

该函数返回一个指向目标存储区 str1 的指针。

用法:

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	const char dest[] = "oldstring";
	const char src[] = "newstring";

	printf("Before memmove dest = %s, src = %s\n", dest, dest);
	memmove(dest, src, 9);
	printf("After  memmove dest = %s, src = %s\n", dest, dest);

	return(0);
}

结果:

memmove函数的模拟实现

数组的地址是从低到高的

cpp 复制代码
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* str1, const void* str2, size_t n)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	void* ret = str1;
	if (str1 < str2)
	{
		//从前向后
		while (n--)
		{
			*(char*)str1 = *(char*)str2;
			str1 = (char*)str1 + 1;
			str2 = (char*)str2 + 1;
		}
	}
	else
	{
		//从后向前
		while (n--)
		{
			*((char*)str1 + n) = *((char*)str2 + n);
		}
	}
	return ret;
}

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

3、memset函数

描述:

C 库函数 void *memset(void *str, int c, size_t n) 用于将一段内存区域设置为指定的值。

memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值。

在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。

在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。

声明;

cpp 复制代码
void *memset(void *str, int c, size_t n)

参数:

  • str -- 指向要填充的内存区域的指针。
  • c -- 要设置的值,通常是一个无符号字符。
  • n -- 要被设置为该值的字符数。

返回值:

该值返回一个指向存储区 str 的指针。

用法:

cpp 复制代码
#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str[50];
 
   strcpy(str,"This is string.h library function");
   puts(str);
 
   memset(str,'$',7);
   puts(str);
   
   return(0);
}

结果:

4、memcmp函数

描述:

C 库函数 int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。

声明:

cpp 复制代码
int memcmp(const void *str1, const void *str2, size_t n)

参数:

  • str1 -- 指向内存块的指针。
  • str2 -- 指向内存块的指针。
  • n -- 要被比较的字节数。

返回值:

  • 如果返回值 < 0,则表示 str1 小于 str2。
  • 如果返回值 > 0,则表示 str1 大于 str2。
  • 如果返回值 = 0,则表示 str1 等于 str2。

用法:

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[15];
   char str2[15];
   int ret;

   memcpy(str1, "abcdef", 6);
   memcpy(str2, "ABCDEF", 6);

   ret = memcmp(str1, str2, 5);

   if(ret > 0)
   {
      printf("str2 小于 str1");
   }
   else if(ret < 0) 
   {
      printf("str1 小于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   
   return(0);
}

结果:

str2 小于 str1

相关推荐
恒悦sunsite几秒前
Redis之配置只读账号
java·redis·bootstrap
独自破碎E几秒前
【前缀和+哈希】LCR_011_连续数组
算法·哈希算法
梦里小白龙6 分钟前
java 通过Minio上传文件
java·开发语言
人道领域7 分钟前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
一条大祥脚8 分钟前
26.1.26 扫描线+数论|因子反演+子序列计数|树套树优化最短路
数据结构·算法
m0_5613596710 分钟前
基于C++的机器学习库开发
开发语言·c++·算法
星空露珠17 分钟前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
2401_8324027518 分钟前
C++中的类型擦除技术
开发语言·c++·算法
努力学习的小廉27 分钟前
我爱学算法之—— 递归回溯综合(二)
开发语言·算法
sheji526128 分钟前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法