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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/204743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么出海企业需要呼叫中心?

随着现代商业世界的发展&#xff0c;企业面临着越来越多的挑战和机遇。为了提高客户服务水平、客户满意度、企业形象和销售业绩&#xff0c;呼叫中心已成为越来越多企业的首选。那么&#xff0c;为什么出海企业需要呼叫中心呢&#xff1f; 1. 提高客户服务质量 首先&#xff…

Linux | tar,bc,uname指令

Linux | tar&#xff0c;bc&#xff0c; 文章目录 Linux | tar&#xff0c;bc&#xff0c;tar指令【重要】bc指令uname –r指令 tar指令【重要】 tar [-cxtzjvf] 文件与目录 … 参数&#xff1a; -c &#xff1a;建立一个压缩文件的参数指令(create 的意思)&#xff1b;-x &am…

为什么对中小企业来说,数字化转型很难?

引言 数字化转型对中小企业至关重要&#xff0c;然而&#xff0c;实施这一转型却充满挑战。中小企业面临着资源、技术、文化和安全方面的种种难题&#xff0c;这些困难限制了它们在数字化领域的发展和竞争力。这种挑战不仅影响企业内部运营&#xff0c;还直接影响其与客户和市…

中国的下一个风口:数字化!

——“中国的下一个风口是什么&#xff1f;数字化&#xff1f;你赞同吗&#xff1f;” ——“中国的下一个风口是不是‘数字化’&#xff0c;不敢妄下定论。” 但可以肯定的是&#xff0c;企业想站上未来产业的风口&#xff0c;“数字化”是必经之路。也就是说&#xff0c;数…

HarmonyOS 开发 Java 与 ArkTS 如何抉择?

本文详细分析 Java 与 ArkTS 在 HarmonyOS 开发过程的区别&#xff0c;力求解答学员的一些困惑。 何为 HarmonyOS&#xff1f; 在讨论语言的差异时&#xff0c;我们先了解下什么是 HarmonyOS。华为官方是这么解释 HarmonyOS 的&#xff1a; “鸿蒙操作系统”特指华为智能终端…

视频集中存储/智能分析融合云平台EasyCVR平台接入rtsp,突然断流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Halcon 机械视觉 使用仿射变换 机械手实现孔位定位

要推算机械手平面坐标系A与相机平面坐标系B的关系&#xff0c;我们可以首先找到两个平面坐标系之间的平移量和旋转量。 平移量&#xff1a;选择一个公共的参考点&#xff0c;比如某个标志物&#xff0c;假设在坐标系A中的坐标为(Ax, Ay)&#xff0c;在坐标系B中的坐标为(Bx, B…

GD32F303移植RT-Thread

我的平台&#xff1a; 芯片&#xff1a;GD32F303CCT6 编译器&#xff1a;KEIL5 一、下载keil专用 RT-Thread 安装包 https://www.keil.arm.com/packs/ 。。。。 。。。。 二、准备一个干净的GD32F303裸机工程&#xff0c;我就增加了串口功能 三、开始移植 1.rt-thread系统…

Java网络编程——非阻塞通信

对于用ServerSocket以及Socket编写的服务器程序和客户程序&#xff0c;它们在运行过程中常常会阻塞。例如当一个线程执行ServerSocket的accept()方法时&#xff0c;假如没有客户连接&#xff0c;该线程就会一直等到有了客户连接才从accept()方法返回。再例如当线程执行Socket的…

Chart 5 性能优化概述

文章目录 前言5.1 可移植性5.2 优化梗概5.3 OpenCL 移植的初始评估5.4 将CPU代码移植到OpenCL GPU5.5 并行化GPU和CPU工作负载5.6 瓶颈分析5.6.1 识别瓶颈5.6.2 解决瓶颈 5.7 API层面性能优化5.7.1 API函数调用的正确安排5.7.2 使用基于事件驱动的pipeline5.7.3 内核编译和构建…

0基础学习云计算难吗?

很多人经常会问云计算是什么&#xff1f;云计算能干什么&#xff1f;学习云计算能做什么工作&#xff1f;其实我们有很多人并不知道云计算是什么&#xff0c;小知今天来给大家讲讲学习云计算能做什么。 中国的云计算行业目前正处于快速发展阶段&#xff0c;随着互联网和数字化…

人脸识别安卓主板_MTK方案智能闸机门禁工业安卓主板定制开发

人脸识别主板广泛应用于各个领域&#xff0c;包括人脸支付系统、人脸识别监控系统、写字楼办公楼门禁闸机、校园、地铁、住宅门禁、考勤机、智能门锁、广告机、售卖机等。 主板基于联发科MTK方案&#xff0c;并由行业PCBA和MTK的核心板组成。根据产品需求&#xff0c;可以选择…

qt creator配置opencv库 (MSVC版本)

目录 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 1.4 新建qt项目 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 D:…

Educational Codeforces Round 159 (Div. 2) A~E

A.Binary lmbalance&#xff08;思维&#xff09; 题意&#xff1a; 给出一个01字符串&#xff0c;你可以对字符串进行无限次下列操作&#xff1a; 选择一个位置 i ( 1 ≤ i ≤ ∣ s ∣ − 1 , |s|为字符串s的长度 ) i(1 \le i \le |s| - 1,\text{|s|为字符串s的长度}) i(1≤…

深度学习实战66-基于计算机视觉的自动驾驶技术,利用YOLOP模型实现车辆区域检测框、可行驶区域和车道线分割图

大家好,我是微学AI,今天给大家介绍一下深度学习实战66-基于计算机视觉的自动驾驶技术,利用YOLOP模型实现车辆区域检测框、可行驶区域和车道线分割图。本文我将介绍自动驾驶技术及其应用场景,并重点阐述了基于计算机视觉技术下的自动驾驶。自动驾驶技术是一种利用人工智能和…

LeetCode刷题--- 计算布尔二叉树的值

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

cache教程1.LRU 缓存淘汰策略

这一节实现LRU算法&#xff0c;要理解明白其使用的数据结构。 FIFO/LFU/LRU 算法简介 Cache的缓存全部存储在内存中&#xff0c;内存是有限的&#xff0c;因此不可能无限制地添加数据。当占用内存超过了给定的内存大小时候&#xff0c;就需要从缓存中移除一条或多条数据了。我…

Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍

本文介绍一下常用的存储芯片DDR3&#xff0c;包括DDR3的芯片型号识别、DDR3芯片命名、DDR3的基本结构等知识&#xff0c;为后续掌握FPGA DDR3的读写控制打下坚实基础。 一、DDR3芯片型​号 电路板上的镁光DDR3芯片上没有具体的型号名。 ​如果想知道具体的DDR3芯片型号&#…

rename--一些例子与问题

指令 A 和指令 B之间存在先写后读(RAW)的相关性 指令 B 的源寄存器 r0 来自于指令 A 产生的结果因此在进行寄存器重命名的时候&#xff0c;指令 B 的 r0 对应的物理寄存器应该直接来自于指令A所对应的P30,而不应该来自于从RAT读取的值。指令A,B,D之间存在先写后写(WAW)的相关性…

阿里云效部署前后端

静态站点到OSS 阿里云-云效&#xff0c;阿里云企业级一站式 DevOps&#xff0c;可以免费使用&#xff08;会限制人数、流水线数量等&#xff0c;个人项目够用了&#xff09;。相关文章 CI 持续集成 - 阿里云云效 OSS 是对象存储的意思&#xff0c;一般一个项目对应一个 Bucke…