字符串函数与内存函数(二)

简介: 内存函数介绍


内存函数介绍


内存函数与字符串函数的区别:

字符串函数:只能对字符串进行操作

内存函数:能够操作任何数据类型(对对象储存的内容进行操作)


memcpy(内存拷贝函数)

  • 定义:


void *memcpy( void *dest, const void *src, size_t count //以字节为单位);


  • 注意:
  1. 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
  2. 这个函数在遇到 '\0' 的时候并不会停下来
  3. 如果source和destination有任何的重叠,复制的结果都是未定义的


  • 函数演示:


#include <stdio.h>
#include <string.h>
int main()
{
  int arr1[10] = { 1,2,3,4,5,6 };
  int arr2[5] = { 0 };
  memcpy(arr2, arr1, 16);
  int i = 0;
  int size = sizeof(arr2) / sizeof(arr2[0]);
  for (i = 0; i < size; i++)
  {
    printf("%d ", arr2[i]);
  }
  return 0;
}
//输出结果:1 2 3 4 0


  • 模拟实现:


void* my_memcpy(void* des, const void* src, size_t n)
{
  assert(des && src);
  void* ret = des;//记录初始位置
  while (n--)//循环拷贝
  {
    *(char*)des = *(char*)src;
    (char*)des = (char*)des + 1;
    (char*)src = (char*)src + 1;
  }
  return ret;
}


memmove(内存移动函数)

  • 定义:


void *memmove( void *dest, const void *src, size_t count );


注:memmove函数相比于memcpy函数能够很好的实现重复地址拷贝(如果source和destination有任何的重叠也能达到想要的结果)


  • 函数演示:


#include <stdio.h>
#include <string.h>
int main()
{
  int arr1[10] = { 1,2,3,4,5,6 };
  int arr2[3] = { 0 };
  memmove(arr1 + 2, arr1, 16);
  int i = 0;
  int size = sizeof(arr1) / sizeof(arr1[0]);
  for (i = 0; i < size; i++)
  {
    printf("%d ", arr1[i]);
  }
  return 0;
}
//输出结果:1 2 1 2 3 4


  • 模拟实现:


void* my_memmove(void* des, const void* src, size_t n)
{
  assert(des && src);
  void* ret = des;
  if (des < src)
  {
    //如果目标在源地前面则从前到后拷贝
    while (n--)
    {
      *(char*)des = *(char*)src;
      (char*)des = (char*)des + 1;
      (char*)src = (char*)src + 1;
    }
  }
  else
  {
    //目标在源地后面则从后到前拷贝
    while (n--)
    {
      *((char*)des + n) = *((char*)src + n);
    }
  }
  return des;
}


memcmp(内存比较函数)

  • 定义:


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


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


  • 函数演示:


#include <stdio.h>
#include <string.h>
int main()
{
  int arr1[] = { 1,2,3,4,5 };
  int arr2[] = { 1,2,3,4,6 };
  printf("%d ", memcmp(arr1, arr2, 16));
  return 0;
}
//输出结果:0


  • 模拟实现:


int my_memcmp(const void* src1, const void* src2, size_t n)
{
  assert(src1 && src2);
  while (--n)
  {
//遇到不同直接退出
    if (*(char*)src1 != *(char*)src2)
    {
      break;
    }
    (char*)src1 = (char*)src1 + 1;
    (char*)src2 = (char*)src2 + 1;
  }
  return *(char*)src1 - *(char*)src2;
}


相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
27天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
154 1
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
23天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
19 0
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
39 0
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
64 0
|
1月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
65 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
366 0