C语言中的内存操作函数:memcpy, memmove, memset, memcmp函数

(博主纯纯小白(dasabi)一枚,如有错误还请指正😇)

目录:

1.重要性

2.函数形式、作用和模拟实现

 

一:内存操作函数的重要性

在C语言中,这四个内存操作函数具有极其重要的地位,它们是底层内存操作的基础工具,广泛应用于各种需要直接操作内存块的场景。

 

二:函数基本形式及作用

2.1  memcpy函数

2.1.1. 函数原型与功能介绍

 void* memcpy(void *dest, const void *src, size_t num)

此函数将从 src 指向的内存区域连续复制 n 个字节的数据到 dest 指向的位置。需要注意的是,memcpy 不保证在源和目标区域重叠时的行为,如果两个区域存在重叠,则可能导致结果不可预测。

2.1.2  模拟实现

//模拟实现strncpy函数

 

#include<stdio.h>

#include<assert.h>

#include<string.h>

//这四个函数的头文件都是string.h

 

void *My_memcpy(void *dest, const void *src, size_t num)

{

 void *ret = dest;

 assert(dest);

 assert(src);

 int i = 0;

 for (i = 0; i < num; i++)

 {

  *(char *) dest = *(char *) src;

  dest = (char *) dest + 1;

  src = (char *) src + 1;

 }

 return ret;

}

 

int main()

{

 char dest[30] = "Hello!";

 char src[30] = "World!";

 printf("%s", memcpy(dest, src, 3));

 return 0;

}

结果显示为:

5822d0ebac0d4d998faa683953cf5261.jpg

 

 

2.2  memmove函数

2.2.1 函数原型与与memcpy的差异

void* memmove(void *dest, const void *src, size_t num)

memmove 函数在功能上类似于 memcpy ,但特别之处在于它能正确处理源和目标内存区域有重叠的情况:当源和目标区域部分或全部重叠时,memmove 会确保所有字节都被正确地复制,即使在拷贝过程中可能会覆盖尚未被复制的部分。

memmove之所以能实现内存空间有重叠的

2.2.2  模拟实现

//模拟实现memmove函数

 

#include<stdio.h>

#include<assert.h>

#include<string.h>

 

void *My_memmove(void *dest, const void *src, size_t num)

{

 void *ret = dest;

 assert(dest);

 assert(src);

 int i = 0, j = 0;

 if (dest <= src || (char *) dest >= (char *) src + num)

 {

  for (i = 0; i < num; i++) 

  {

   *(char *) dest = *(char *) src;

   dest = (char *) dest + 1;

   src = (char *) src + 1;

  }

 } else

 {

  dest = (char *) dest + num - 1;

  src = (char *) src + num- 1;

  for (j = 0; j < num; j++)

  {

   *(char *) dest = *(char *) src;

   dest = (char *) dest - 1;

   src = (char *) src - 1;

  }

 }

 return ret;

}

 

int main()

{

 char dest[30] = "Hello,18542764!";

 char src[30] = "World!";

 My_memmove(dest + 4, dest + 1, 3);

 printf("%s", dest);

 return 0;

}

 

结果显示为:ff4d36f327a34150bade50795252b2f4.jpg

 (“ell”替换“o,1”)

 

 

2.3  memset函数

2.3.1. 函数原型与功能说明

void* memset(void *str, int c, size_t num)

memset 函数用于将指定的内存区域初始化为特定的值:该函数将 value 所代表的字节值填充至 ptr 指向的内存区域,填充长度为 num 个字节。

2.3.2.  模拟实现

#include<stdio.h>

#include <assert.h>

 

void *my_memset(void *ptr, int value, size_t num)

{

 assert(ptr != NULL); 

 char *ret = (char *) ptr; 

 for (int i = 0; i < num; i++)

 {

  *ret++ = (char) value; 

 }

 return ptr; // 返回初始的ptr作为结果

}

 

int main()

{

 char str[] = "Hello, world!";

 my_memset(str, '0', 3);

 printf("%s", str);

 return 0;

}

 

打印结果为:99809c10b922470a8bd77f366022cb73.jpg

 

 

2.4  memcmp函数

2.4.1. 函数原型与功能介绍

  int memcmp(const void *str1, const void *str2, size_t num)

memcmp 函数用于比较两个内存区域的内容:

它将返回一个整数值,表示从 ptr1 和 ptr2 开始的 num 个字节之间的差异。如果两个内存块完全相等,则返回0;如果 ptr1 指向的内容小于 ptr2 ,则返回负数;反之则返回正数。

2.4.2.模拟实现

#include<stdio.h>

#include <assert.h>

 

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

{

 assert(ptr1 != NULL && ptr2 != NULL);

 

 const char *p1 = (const char *) ptr1;

 const char *p2 = (const char *) ptr2;

 

 for (size_t i = 0; i < num; ++i)

 {

  if (*p1 != *p2)

  {

   return (*(char *) p1 - *(char *) p2);

  }

  p1++;

  p2++;

 }

 

 return 0;

}

 

int main()

{

 char str1[] = "Hello, world!";

 char str2[] = "Hello, world!";

 char str3[] = "Hello, word!";

 int a=my_memcmp(str1, str2, 13);

 int b=my_memcmp(str1, str3, 11); 

 printf("%d %d",a,b);

 return 0;

}

 

结果显示为:7a45e1a0bb22426992e2fafa7002456d.jpg

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值