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

C语言内存函数讲解

目录

文章目录

内存函数针对的数据类型不确定可能是整型数据,字符数据,结构体数据......

memcpy的使用和模拟实现

 memcpy的使用

memcpy打印字符数据

 memcpy打印整型数据

 memcpy的模拟实现

 模拟实现的memcpy打印重叠情境

 memmove的使用和模拟实现

 memmove的使用

 memove的模拟实现

 memset函数的使用和模拟实现

 memset的使用

 memset的模拟实现

 memcmp的使用和模拟实现

memcmp的使用

 memcmp的模拟实现



内存函数针对的数据类型不确定可能是整型数据,字符数据,结构体数据......

memcpy的使用和模拟实现

我们先看一下菜鸟教程中对memcpy的解释

 

 void *memcpy(void *str1, const void *str2, size_t n)

 memcpy的使用

memcpy打印字符数据

#include <stdio.h>
#include <string.h>
int main()
{char arr[100] = { 0 };char arr2[50] = "woshi shuaige";memcpy(arr, arr2, 7);int i = 0;for (i = 0; i < 7; i++){printf("%c", arr[i]);}return 0;
}

 

 memcpy打印整型数据

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

 memcpy最好不要处理重叠的内存,对于重叠的内存,我们交给memmove来处理

 memcpy的模拟实现

#include <stdio.h>
#include <assert.h>
void* mymemcpy(void* str1, const void* str2, size_t n)
{void* ret = str1;assert(str1, str2);while (n--){*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}return ret;
}
int main()
{char arr[100] = { 0 };char arr2[50] = "woshi shuaige";mymemcpy(arr, arr2, 7);int i = 0;for (i = 0; i < 7; i++){printf("%c", arr[i]);}return 0;
}

 模拟实现的memcpy打印重叠情境

void* mymemcpy(void* str1, const void* str2, size_t n)
{void* ret = str1;assert(str1, str2);while (n--){*(char*)str1 = *(char*)str2;str1 = (char*)str1 + 1;str2 = (char*)str2 + 1;}return ret;
}
int main()
{int arr[50] = {1,2,3,4,5,6,7,8,9,10};mymemcpy(arr+2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

 

 memmove的使用和模拟实现

 

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

 memmove的使用

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

 

 memove的模拟实现

 


#include <stdio.h>
#include <assert.h>
void* mymemmove(void* destination, const void* source, size_t num)
{void* ret = destination;assert(destination && source);if (destination < source){while (num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}}else{while (num--){*((char*)destination + num) = *((char*)source + num);}}return ret;
}
int main()
{int arr[50] = { 1,2,3,4,5,6,7,8,9,10 };mymemmove(arr+2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

 memset函数的使用和模拟实现

 

 

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

 memset的使用

#include <stdio.h>
#include <string.h>
int main()
{char arr[50] = "woshi shuaige";memset(arr, 'x', 6);printf("%s", arr);return 0;
}

 

 注意memset在设置的时候,是以字节为单位来设置的。

 memset的模拟实现

#include <stdio.h>
void* mymemset(void* ptr, int value, size_t num)
{void* ret = ptr;int i = 0;for (i = 0; i < num; i++){*((char*)ptr + i) = 'x';}return ret;
}
int main()
{char arr[50] = "woshi shuaige";mymemset(arr, 'x', 5);printf("%s", arr);return 0;
}

 

 memcmp的使用和模拟实现

 

 

 

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

memcmp的使用

#include <stdio.h>
#include <string.h>
int main()
{char arr[100] = "woshi shuaige";char arr1[50] = "woshi shuaibi";int ret=memcmp(arr, arr1, 12);printf("%d\n", ret);return 0;
}

 memcmp的模拟实现

#include <stdio.h>
int mymemcmp(const void* ptr1, const void* ptr2, size_t num)
{while (num--){if (*(char*)ptr1 > *(char*)ptr2){return 1;}else if (*(char*)ptr1 < *(char*)ptr2){return -1;}else{ptr1 = (char*)ptr1 + 1;ptr2 = (char*)ptr2 + 1;}}return 0;
}
int main()
{char arr[100] = "woshi shuaige";char arr1[50] = "woshi shuaibi";int ret = mymemcmp(arr, arr1, 12);printf("%d\n", ret);return 0;
}

相关文章:

  • C语言二叉树的基本概念(一)
  • 【OpenCV】计算机视觉图像处理基础知识
  • 校园外卖小程序源码系统 附带完整的搭建教程
  • 超简单,NodeJs发送短信验证码的4种方式+例子
  • 【开题报告】基于SpringBoot的自闭症知识宣传平台的设计与实现
  • 无公网IP环境Windows系统使用VNC远程连接Deepin桌面
  • PHP使用HTTP代码示例模板
  • 医院有HIS系统,为什么还要开发预约挂号小程序?数据如何互通?
  • springboot数据格式验证——自定义日期格式验证及list验证
  • js vue 输入正确手机号/邮箱后,激活“发送验证码”按钮
  • springboot 在自定义注解中注入bean,解决注入bean为null的问题
  • mac M系列芯片安装chatGLM3-6b模型
  • 软件测试外包干了2个月,技术进步2年。。。
  • ComplexHeatmap热图专栏 | 6. 3D热图绘制教程
  • 基于单片机的电子密码锁设计
  • Android交互
  • HTTP--网络协议分层,http历史(二)
  • js数组之filter
  • js写一个简单的选项卡
  • ng6--错误信息小结(持续更新)
  • Python 基础起步 (十) 什么叫函数?
  • text-decoration与color属性
  • Web标准制定过程
  • 给github项目添加CI badge
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 缓存与缓冲
  • 基于web的全景—— Pannellum小试
  • 前端_面试
  • 使用common-codec进行md5加密
  • 使用Gradle第一次构建Java程序
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序设置上一页数据
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 追踪解析 FutureTask 源码
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​油烟净化器电源安全,保障健康餐饮生活
  • !!java web学习笔记(一到五)
  • #git 撤消对文件的更改
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (C语言)fread与fwrite详解
  • (篇九)MySQL常用内置函数
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (算法)求1到1亿间的质数或素数
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)用.Net的File控件上传文件的解决方案
  • .gitignore文件---让git自动忽略指定文件
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NetCore部署微服务(二)
  • .ui文件相关
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ C++ ] STL---stack与queue
  • [\u4e00-\u9fa5] //匹配中文字符