c语言-库函数memcpy()、memmove()、memcmp()、memset()介绍

2024-01-18 09:52

本文主要是介绍c语言-库函数memcpy()、memmove()、memcmp()、memset()介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、库函数memcpy()
    • 1.1 memcpy()介绍
    • 1.2 memcpy()模拟实现
  • 二、库函数memmove()
    • 2.1 memmove()介绍
    • 2.2 memmove()模拟实现
  • 三、库函数memcmp()
    • 3.1 memcmp()介绍
  • 四、库函数memset()
    • 4.1 memset()介绍
  • 总结


前言

本篇文章介绍c语言库函数memcpy()、memmove()、memcmp()、memset()的使用。


一、库函数memcpy()

1.1 memcpy()介绍

memcpy()实现的是内存块拷贝。
下面是cplusplus网站关于这个库函数的介绍以及使用
在这里插入图片描述
说明:

  • 从source指向的内存块拷贝num个字节到destination指向的内存块中。
  • source和destination的指针类型可以是任何类型,因为拷贝的是二进制数据。
  • memcpy()不会在source检查终止字符,永远拷贝num个字节。
  • memcpy()一般用于拷贝两个独立的内存块。

使用:

  1. 两个独立内存块的拷贝
    在这里插入图片描述
  2. 重叠内存块的拷贝(重叠内存块:指destination和source指向同一块内存)
    在这里插入图片描述

1.2 memcpy()模拟实现

代码实现:

#include<assert.h>
void* my_memcpy(void* destination, const void* source, size_t num)
{assert(destination && source); //空指针判断void* dest = destination;while (num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}return dest;
}

代码测试:

  1. 两个独立内存块的拷贝
    在这里插入图片描述

  2. 重叠内存块的拷贝
    在这里插入图片描述
    观察输出结果:
    输出的结果和memcpy()的结果不相同;
    memcpy()是visual studio编译器库函数,实现的功能包含了重叠内存块的拷贝;
    my_memcpy()实现的方式是从source的指向的第一个字节一直拷贝到num个字节,按照的是从前往后拷贝,这种实现方式,导致了前面的字节数据覆盖了后面的字节数据,即改变了源数据。
    所以,my_memcpy()只能拷贝两个没有交集的两个内存块。


二、库函数memmove()

2.1 memmove()介绍

memmove()是实现两个内存块的移动。本质还是两个内存块的拷贝。
下面是cplusplus网站关于这个库函数的介绍以及使用
在这里插入图片描述
说明:

  • memmove()可以拷贝两个独立的内存块。
  • memmove()也可以用于拷贝两个重叠的内存块。
  • memmove()一般用于拷贝两个重叠的内存块。

使用:
在这里插入图片描述

2.2 memmove()模拟实现

实现思路:
考虑的情况:
情景一:destination和source指向的内存块没有交集
在这种情况下,无论从前往后拷贝还是从后往前拷贝,都可以保证source指向的数据完整性。

情景二:destination和source指向的内存块有交集
在这种情景下,有两种情况
情况一:destination在source的后面
情况二:destination在source的前面

情况一的处理方式:
当destination在source后面时,应该从source指向的第num个字节开始拷贝,即从后往前拷贝
这样做可以实现source的第一个字节到第num个字节不会被覆盖。
在这里插入图片描述

情况二的处理方式:
当destination在source后面时,应该从source指向的第1个字节开始拷贝,即从前往后拷贝
这样做可以实现source的第一个字节到第num个字节不会被覆盖。
在这里插入图片描述

代码实现:

void* my_memmove(void* destination, const void* source, size_t num)
{assert(destination && source);void* dest = destination;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 dest;
}

代码测试:

  1. destination > source
    在这里插入图片描述
  2. destination < source
    在这里插入图片描述

三、库函数memcmp()

3.1 memcmp()介绍

memcmp()实现的是两个内存块的比较。
下面是cplusplus网站关于这个库函数的介绍以及使用
在这里插入图片描述
说明:

  • 每次比较一个字节的内容的大小,如果两个字节的内容不相等,直接返回比较结果
  • 最多比较num个字节。

使用:
在这里插入图片描述


四、库函数memset()

4.1 memset()介绍

memset()实现的是填充内存块。
下面是cplusplus网站关于这个库函数的介绍以及使用
在这里插入图片描述
说明:

  • 为ptr指向的内存块的num个字节赋值,每个字节的值为value
  • value为int,当在填充时会被强制转化为unsigned char类型

使用:
在这里插入图片描述


总结

本篇文章介绍了c语言库函数memcpy()、memmove()、memcmp()、memset()的使用,以及模拟实现了memcpy()和memmove()。

这篇关于c语言-库函数memcpy()、memmove()、memcmp()、memset()介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618686

相关文章

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超