当前位置: 首页 > news >正文

【C语言】16. 内存函数

文章目录

  • 一、 memcpy使⽤和模拟实现
  • 二、memmove使⽤和模拟实现
  • 三、memset函数的使⽤
  • 四、memcmp函数的使⽤

一、 memcpy使⽤和模拟实现

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

• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。

• 这个函数在遇到 ‘\0’ 的时候并不会停下来。

• 如果source和destination有任何的重叠,复制的结果都是未定义的。

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

对于重叠的内存,交给memmove来处理。
memcpy函数的模拟实现:

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);
}

二、memmove使⽤和模拟实现

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

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

• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

#include <stdio.h>#include <string.h>int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1+2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

输出的结果:

1 2 1 2 3 4 5 8 9 10

memmove的模拟实现:

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);
}

三、memset函数的使⽤

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

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

#include <stdio.h>#include <string.h>int main ()
{char str[] = "hello world";memset (str,'x',6);printf(str);return 0;
}

输出的结果:

xxxxxxworld

四、memcmp函数的使⽤

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

• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节er

• 返回值如下:
在这里插入图片描述

#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;
}

http://www.mrgr.cn/news/79401.html

相关文章:

  • vscode通过ssh连接远程服务器(实习心得)
  • Golang学习笔记_05——延迟调用
  • WIN11中安装Mamba常见问题解决方案
  • Maven 安装配置(详细教程)
  • 【蓝桥杯每日一题】技能升级
  • Maven、mybatis框架
  • 面经自测——死锁/死锁的必要条件/死锁的预防/进程通信的方式
  • 微信小程序实现图片拖拽调换位置效果 -- 开箱即用
  • linux-线程
  • Ubuntu操作系统在Vmware中的安装、常用操作、最基础的知识、imx6ll基本开发环境配置
  • pushgateway HA高可用方案
  • MVC基础——市场管理系统(一)
  • node.js中跨域请求有几种实现方法
  • 智慧商城项目(vue核心技术与实战)
  • 进入保护模式
  • 【Linux】防火墙
  • 代码随想录算法训练营day50|动态规划12
  • Codeforces Round 991 (Div. 3)
  • 【C语言】C语言的变量和声明系统性讲解
  • 重磅更新:CnosDB 2.3.5.4 版本上线, 性能提升,问题修复一网打尽
  • 吉他初学者学习网站搭建系列(9)——如何用coze做一个网站助手
  • 事件循环(eventloop)
  • PySpark3.4.4_基于StreamingContext实现网络字节流中英文分词词频累加统计结果保存到数据库中
  • 游戏引擎学习第36天
  • Spring事务实现原理
  • 公共云提供商正在错失人工智能机遇