C语言内存函数(超详解)


乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen
我的专栏:c语言
点击主页:optimistic_chen和专栏:c语言,
创作不易,大佬们点赞鼓励下吧~

文章目录

  • 1.memcpy函数(内存拷贝)
  • 2. memmove函数
  • 3.memset函数
  • 4.memcmp函数
  • 完结

1.memcpy函数(内存拷贝)

在这里插入图片描述

总结:
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
• 这个函数在遇到 ‘\0’ 的时候并不会停下来。
• 如果source和destination有任何的重叠,复制的结果都是未定义的。

直接实现

#include <stdio.h>
#include <string.h>struct {char name[40];int age;
} person, person_copy;int main ()
{char myname[] = "Pierre de Fermat";/* using memcpy to copy string: */memcpy ( person.name, myname, strlen(myname)+1 );person.age = 46;/* using memcpy to copy structure: */memcpy ( &person_copy, &person, sizeof(person) );printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );return 0;
}

在这里插入图片描述

自主实现

//memcpy函数拷贝结束后,会返回起始地址
2	my_memcpy(void* dest, void* src, size_t num)//num为字节数,char*最合适
3	{
4		void *ret = dest;
5		assert(dest && src);
6		while (num--)
7		{
8			//使用char*指针解引用访问一个字节
9			*(char*)dest = *(char*)src;
10			src = (char*)src + 1;
11			dest = (char*)dest + 1;
12		 }
13		return ret;
14	}
15	int main()
16	{
17		int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
18		int arr2[20] = { 0 };
19		//memcpy(arr2, arr, 20);
20		my_memcpy(arr2, arr, 20);
21		int i = 0;
22		for (i = 0; i < 20; i++)
23		{
24			printf("%d ", arr2[i]);
25		}
26	
27		return 0;
28	}

2. memmove函数

在这里插入图片描述

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

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

直接实现

#include <stdio.h>
#include <string.h>int main ()
{char str[] = "memmove can be very useful......";memmove (str+20,str+15,11);puts (str);return 0;
}

在这里插入图片描述

自主实现

void * memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))  
{
while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}
}
else 
{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);
}

3.memset函数

在这里插入图片描述
总结:
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容

直接实现

#include <stdio.h>
#include <string.h>int main ()
{char str[] = "almost every programmer should know memset!";memset (str,'-',6);puts (str);return 0;
}

在这里插入图片描述

4.memcmp函数


总结:
• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
在这里插入图片描述

直接实现

#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.mzph.cn/news/785242.shtml

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

相关文章

Qt——Qt绘图之QPainter的使用总结(使用paintEvent实现旋转图片效果)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》

gitee创建仓库后的基本指令

简易的命令行入门教程: Git 全局设置: git config --global user.name "user.name" git config --global user.email "user.email"创建 git 仓库: mkdir 项目名 cd 项目名 git init touch README.md git add README.md git commit -m "first comm…

KIl5:Stm32L071下载出现flash download faild “cortex-m0+“的解决方法

首先看看有没有芯片&#xff0c;没有芯片下载一下 下载并在device选择对应的芯片 选择调试器 选择flash

C++ 二叉树OJ题

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;C知识分享⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 前言 C二叉搜索树 这篇讲解了搜索二叉…

MySQL经验分享:Shell开发问题

背景 之前整理过Python连接使用MySQL的经验&#xff0c;链接如下&#xff1a; pymysql封装总结_pymysql封装类-CSDN博客 相比高级语言&#xff0c;Shell与MySQL开发使用相对会更麻烦一些&#xff1b;由于 shell是linux命令集的概称&#xff0c;是属于命令行的人机界面。Shel…

1688采集商品信息 马帮 店小秘 芒果采集API接口 java php

1688详情API接口是一种基于开放平台的应用程序接口&#xff0c;它能够实现与1688平台的数据交互&#xff0c;让商家能够更加方便地获取商品详情、库存信息、价格变动等重要数据。通过这一接口&#xff0c;商家可以实时掌握市场动态&#xff0c;快速响应消费者需求&#xff0c;从…

jenkins进行自动化部署

jenkins自动化部署 hello&#xff0c;大家好&#xff0c;前文我们已经下载好我们的jenkins了&#xff0c;下面我们用jenkins来实现自动化部署啦&#xff01; 一、下载插件 我们选择插件管理 一个是Maven Integration plugin&#xff0c;一个是 Publish Over SSH 这里因为作…

【uniapp】uniapp实现免密登录

文章目录 一、概要二、整体架构流程三、技术名词解释四 、技术细节1.存取token有效期&#xff1f;2.使用setStorageSync而不使用setStorage&#xff1f;3.使用onLaunch而不使用全局路由&#xff1f; 一、概要 打开一个网页或小程序的时候&#xff0c;我们有时候会自动进入主页…

leetCode-01

***砍竹子I&#xff1a; 动态规划&#xff1a; public int cuttingBamboo(int bamboo_len) {int[] dpnew int[bamboo_len1];dp[0]0;dp[1]1;for (int i 2; i <bamboo_len ; i) {int max0;for (int j 1; j < i; j) {maxMath.max(max,Math.max(j*(i-j),j*dp[i-j]));}dp[i…

动态ip白名单频繁更改问题解决方案

1. 使用静态IP地址&#xff1a;可以通过向ISP申请静态IP地址来解决动态IP地址的变化问题&#xff0c;但是这种方法会比较贵。 2. 使用动态DNS&#xff1a;可以使用动态DNS服务&#xff0c;它可以将动态IP地址映射到一个固定的域名&#xff0c;从而使得动态IP地址处理为域名一直…

Linux 命令显示网络接口IP地址,可以在谷歌/甲骨文云shell上运行

显示当前网络接口IP 方法A&#xff1a; awk /32 host/ { print f } {f$2} <<< "$(</proc/net/fib_trie)" 方法B&#xff1a; #!/bin/bash ft_local$(awk $1"Local:" {flag1} flag <<< "$(</proc/net/fib_trie)") for …

嵌入式驱动学习第五周——驱动模块

前言 Linux驱动有两种运行方式&#xff0c;第一种是将驱动编译进Linux内核中&#xff0c;另一种是编译成模块&#xff0c;本篇博客来介绍一下驱动模块。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可…

Oladance、南卡、韶音开放式耳机值得买吗?爆款实测拒绝踩坑!

​在寻找最佳开放式耳机的过程中&#xff0c;我亲自试用并评估了市场上三个备受欢迎的品牌&#xff1a;Oladance、南卡和韶音。通过全面的多维度性能测试&#xff0c;我旨在为大家提供准确的购买指南&#xff0c;避免因选择不当而遭遇音质失真或佩戴不适的问题。 选择正确的耳…

window7 SP2

网上很多window7 SP1的更新教程&#xff0c;很少有sp2的教程 参考博客Windows 7 Service Pack 2 Download and Install (64-bit/32-bit) 即 转到 Microsoft 网站上的 Windows 7 Service Pack 2下载页面 。 选择与 Windows 7 版本相对应的 “下载 ”链接。 也可以 登录官网…

【LeetCode周赛】第 391 场周赛

目录 100263. 哈沙德数 简单100235. 换水问题 II 中等100266. 交替子数组计数 中等 100263. 哈沙德数 简单 100263. 哈沙德数 分析&#xff1a; 按题意将数的各个数位进行求和&#xff0c;计算即可。 代码&#xff1a; class Solution { public:int sumOfTheDigitsOfHarsha…

https安全性 带给im 消息加密的启发

大家好&#xff0c;我是蓝胖子&#xff0c;在之前# MYSQL 是如何保证binlog 和redo log同时提交的&#xff1f;这篇文章里&#xff0c;我们可以从mysql的设计中学会如何让两个服务的调用逻辑达到最终一致性&#xff0c;这也是分布式事务实现方式之一。今天来看看我们能够从http…

get和post的区别!

1.get请求一般是去取获取数据&#xff08;其实也可以提交&#xff0c;但常见的是获取数据&#xff09;&#xff1b; post请求一般是去提交数据。 2.get因为参数会放在url中&#xff0c;所以隐私性&#xff0c;安全性较差&#xff0c;请求的数据长度是有限制的&#xff0c; 不同…

【Qt 学习笔记】Day3 | 使用两种方式实现helloworld

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Day3 | 使用两种方式实现helloworld 文章编号&#xff1a;Qt 学习笔记…

【CTSDB数据集转换成YOLO格式】

CSTDB数据集介绍 CTSDB数据集 Dataset consists of 5998 traffic sign images of 58 categories. Each image is a zoomed view of single traffic sign. Annotations provide image properties (file_name, width, height) as well as traffic sign coordinates within imag…

移动硬盘怎么加密?移动硬盘加密软件有哪些?

移动硬盘是我们在工作中最常用的移动存储设备&#xff0c;为了保护数据安全&#xff0c;需要使用专业的移动硬盘加密软件加密保护。那么&#xff0c;移动硬盘加密软件有哪些&#xff1f; ​BitLocker BitLocker是Windows的磁盘加锁功能&#xff0c;可以用于加密保护移动硬盘中…