【C初阶】内存函数:memcpy+memmove+memset+memcmp

简介: 【C初阶】内存函数:memcpy+memmove+memset+memcmp

1.memcpy使用和模拟实现

基本语法如下:

注意:
1.函数的功能:从src的位置开始向后复制n个字节的数据到dest指向的内存位置
2.这个函数正在遇到’\0’并不会停止,memcpy函数并不关心内存的内容
3.如果dest与src有任何的重叠拷贝都是未定义结果,并不在C标准考虑之内

//memcpy的使用
int main()
{
  int src[10] = { 1,2,3,4,5,6,7,8,9,10};
  int dest[10] = { 0 };
  memcpy(dest, src, 20);
  
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", dest[i]);
  }
  return 0;
}

那对于重叠的内存空间拷贝呢?

对于重叠的内存空间拷贝,我们需要使用库函数memmove函数

下面是对memcpy函数的模拟实现:

//方法1:
void * memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
/*
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
//方法2:
void* my_memcpy(void* dest, void* src,size_t num)
{
  assert(dest && src);
  while (num--)
  {
    *((char*)dest+num) = *((char*)src+num);
  }
  return dest;
}

2.memmove的使用和模拟实现

注意:
1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2.如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

memmove函数的使用举例:

//memmove函数的使用
int main()
{
  int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 1,2,3,4,5,6,7,8,9,10 };
  memmove(arr1 + 2, arr1, 20);
  memmove(arr2, arr2+2, 20);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr1[i]);
  }
  printf("\n\n");
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr2[i]);
  }
  return 0;
}

memmove的模拟实现:

//方法1:
void * memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {
/*
* Non-Overlapping Buffers
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
/*
* Overlapping Buffers
* copy from higher addresses to lower addresses
*/
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
//方法2:
void* my_memmove(void* dest, const void* src, size_t num)
{
  assert(dest && src);
  if (dest > src)
  {
    while (num--)
    {
      *((char*)dest + num) = *((char*)src + num);
    }
  }
  else
  {
    while (num--)
    {
      static int i = 0;
      *((char*)dest + i) = *((char*)src + i++);
    }
  }
  return dest;
}

3.memset函数的使用

//memset函数的使用
int main()
{
  char arr[10] = "abcdef";
  char* ch = (char*)memset(arr, 'x', 5);
  printf("%s\n", ch);
  return 0;
}

4.memcmp函数的使用

//memcmp函数的使用
int main()
{
  char arr[20] = "abcdef";
  char cmp[20] = "abcxxxxxxxxx";
  int n = memcmp(arr, cmp, 5);
  printf("%d\n", n);
  if (n > 0)
    printf(">\n");
  else if (n == 0)
    printf("=\n");
  else
    printf("<\n");
  return 0;
}

相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
30天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
25天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
21 0
|
4月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
283 14
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
376 0
|
24天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
53 1
|
29天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
41 4
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配