详解4大C语言内存函数【超详细建议点赞收藏】

目录

  • 1. memcpy----内存拷贝
    • 1.1 函数介绍
    • 1.2 函数使用
    • 1.3 模拟实现
  • 2. memmove----重叠内存的数据拷贝
    • 2.1 函数介绍
    • 2.2 函数使用
    • 2.3 模拟实现
  • 3. memcmp----内存比较
    • 3.1 函数介绍
    • 3.2 函数使用
  • 4.memset----内存设置
    • 4.1 函数介绍
    • 4.2 函数使用

注意:以下4个内存函数在使用时都要引用头文件<string.h>

1. memcpy----内存拷贝

1.1 函数介绍

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/aa0f1f6ff11a4f7b985ae91cade927c6.png

  • 参数类型与返回值类型都是void* ,这是因为这个函数不仅可以拷贝字符串,也可以拷贝整型,浮点型等,所以需要泛型指针接收。(注:若想了解void* 指针的使用,请移步我的主页浏览文章《深入理解指针变量》)
  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。
  • 注意:这个函数只负责拷贝两块独立空间的数据。(事实上我们在VS2022上用这个函数进行重叠内存的拷贝是可以编译成功的,但是一般不用来处理重叠内存的拷贝,会有专门的memmove函数实现

1.2 函数使用

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

输出结果:
在这里插入图片描述

如果我们进行重叠内存的拷贝:

#include <stdio.h>
#include <string.h>int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };//int arr2[10] = { 0 };memcpy(arr1, arr1+3, 20);//把arr1中的45678拷贝(重叠覆盖)到1234int i = 0;for (i = 0; i <10 ; i++){printf("%d ", arr1[i]);}return 0;
}

输出结果:
在这里插入图片描述

1.3 模拟实现

#include <stdio.h>
#include <assert.h>void* my_memcpy(void* dest,const void* src, size_t num)
{assert(dest && src);void* ret = dest;while (num--){*(char*)dest = *(char*)src;src = (char*)src+1;dest = (char*)dest + 1;}return ret;
}int main()
{int arr1[] = { 1,2,3,4,5,6 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 24);int i = 0;for (i = 0; i < 6; i++){printf("%d ", arr2[i]);}return 0;
}

2. memmove----重叠内存的数据拷贝

2.1 函数介绍

在这里插入图片描述

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

2.2 函数使用

#include <stdio.h>
#include <string.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr + 2, arr, 24);//把arr中的123456拷贝(覆盖)到345678int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

输出结果:

在这里插入图片描述

2.3 模拟实现

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

3. memcmp----内存比较

3.1 函数介绍

在这里插入图片描述

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

3.2 函数使用

#include <stdio.h>
#include <string.h>int main()
{int arr1[] = { 1,2,3,4,5 };//00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05int arr2[] = { 1,3,5 };    //00 00 00 01 00 00 00 03 00 00 00 05int ret = memcmp(arr1, arr2,12);printf("%d\n", ret);return 0;
}

比较的内存状况:
在这里插入图片描述

4.memset----内存设置

4.1 函数介绍

在这里插入图片描述

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

4.2 函数使用

  1. 正确使用
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdef";memset(arr, 'z', 4);printf("%s\n", arr);return 0
}

把字符数组arr中的4个字节设置成字符z。
输出结果:

在这里插入图片描述

  1. 错误使用

有些人想使用memset函数把整型数组初始化成1?
这是错误的!!
因为memset函数设置的是字节,是把内存中的该数组的所有字节变为1,打印出来是一个非常大的数字,不能把整型数组初始化为1。

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

输出结果:

在这里插入图片描述

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

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

相关文章

什么是 Sepolia 测试网以及如何从 Faucet 获取 Sepolia ETH

如何通过水龙头领取 Sepolia 测试网 ETH 代币 Sepolia 测试网需要 Sepolia ETH 代币来测试即将推出的 dApp&#xff0c;然后再在以太坊主网上线。您可以从 Alchemy、QuickNode 和 Infura 水龙头领取 Sepolia 测试网 ETH。 要点 您可以从官方水龙头和其他一些独立水龙头获取 S…

面试题:链表相交

链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 思路 这个题目有2个思路&#xff0c;我先说容易想到的思路 对齐链表…

有人总结了浅色系可视化大屏优点,我要是小白,我就信了。

浅色系适合在电脑上展示&#xff0c;不适合在大屏展示&#xff0c;有人总结了浅色系大屏优点&#xff0c;我捡要点说下。 浅色系可视化大屏幕在数据可视化中具有多个优点&#xff1a; 首先&#xff0c;浅色系色彩明亮清新&#xff0c;能够提升人们的视觉感受和心情&#xff0c…

[Flink04] Flink部署实践

Flink部署支持三种模式&#xff1a;本地部署、Standalone部署、Flink on Yarn部署。 独立&#xff08;Standalone&#xff09;模式由Flink自身提供资源&#xff0c;无需其他框架&#xff0c;这种方式降低了和其他第三方资源框架的耦合性&#xff0c;独立性非常强。但Flink 是大…

遇到问题(二) 中文乱码

例如这样&#xff1a; 原本是这样&#xff1a; 解决方法&#xff1a;点击扳手工具设置——Editor——Encoding——选chinese GB2312&#xff08;有的是UTF-8&#xff09;

同学在外包干了两年的点点点,24岁人就快废了

前言 简单的说下&#xff0c;我大学的一个同学&#xff0c;毕业后我自己去了自研的公司&#xff0c;他去了外包&#xff0c;快两年了我薪资、技术各个方面都有了很大的提升&#xff0c;他在外包干的这两年人都要废了&#xff0c;技术没一点提升&#xff0c;学不到任何东西&…

在ubuntu中制作ubuntu的U盘启动盘

概要&#xff1a; 本篇演示在ubuntu22.04中制作ubuntu22.04的U盘启动盘 一、下载ubuntu22.04的iso文件 访问ubuntu官网https://ubuntu.com自行下载ubuntu官网 二、制作U盘启动盘 打开系统自带软件Startup Disk Creator 软件会自动检测iso文件和U盘 点击Make Startup Disk…

Java 线程通信模型小案例

Java 线程通信模型小案例 package com.zhong.thread.usethread;import java.util.ArrayList; import java.util.List;/*** ClassName : CookAndFood* Description : 锁的应用厨师和包子问题* Author : zhx* Date: 2024-02-19 15:43*/ public class CookAndFood {public static …

一分钟学会如何查看Python内置函数的用法及其源码

在用Python进行各种分析的时候&#xff0c;我们会用到各种各样的函数&#xff0c;比如&#xff0c;我们用SQL时&#xff0c;经常使用join、max等各种函数&#xff0c;那么想看Python是否有这个函数&#xff0c;这个时候可能大部分人会百度&#xff0c;那么如何不使用百度&#…

【设计模式】4、策略模式

文章目录 一、问题二、解决方案2.1 真实世界的类比2.2 策略模式结构2.3 适用场景2.4 实现方式2.5 优缺点2.6 与其他模式的关系 三、示例代码3.1 go3.2 rust3.2.1 通过 trait 实现3.2.2 function closure 策略模式是一种行为设计模式&#xff0c;它能定义一系列算法&#xff0c…

第五次作业:LMDeploy 的量化和部署

参考文档&#xff1a;https://github.com/InternLM/tutorial/blob/main/lmdeploy/lmdeploy.md 基础作业&#xff1a; 使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型&#xff0c;生成 300 字的小故事&#xff08;需截图&#xff09; …

上网行为监控软件能够看到聊天内容吗

随着网络技术的迅猛发展和广泛应用&#xff0c;上网行为监控软件逐渐成为许多企业和组织维护网络安全、提高工作效率的重要工具。这些软件可以实时监控和记录员工的网络活动&#xff0c;包括访问的网站、下载的文件、使用的应用程序等。 然而&#xff0c;一个常见的问题是&…