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

news2024/11/27 18:36:32


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

我的主页: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.coloradmin.cn/o/1560745.html

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

相关文章

Gradle 使用详解

目录 一. 前言 二. 下载与安装 2.1. 下载 2.2. 配置环境变量 2.3. 配置镜像 2.3.1. 全局设置 2.3.2. 项目级设置 三. Gradle 配置文件 3.1. build.gradle 3.2. settings.gradle 3.3. gradle.properties 3.4. init.d 目录 3.5. buildSrc 目录 四. Java Library 插…

[flask]请求全局钩子

flask从入门到精通之钩子、异常、context、jinjia模板、过滤器 - 异步非阻塞 - 博客园 (cnblogs.com) 参考的这个博客&#xff0c;但有一个需要注意的是&#xff0c;最新版本的flask不知道是不是更新了还是怎么了&#xff0c;他的before_first_request不见了&#xff0c;如果继…

17.应用负载压力测试

早些点&#xff0c;下午题考&#xff0c;最近几年出现的少&#xff1b; 备考较为简单&#xff1b;历年真题相似度高&#xff1b; 主要议题&#xff1a; 1.负载压力测试概述 注意这些测试细微的差别&#xff1b; 负载测试和压力测试的方法比较相似&#xff0c;但是目的不同&a…

科研学习|论文解读——情感对感知偶然信息遭遇的影响研究(JASIST,2022)

原文题目 Investigating the impact of emotions on perceiving serendipitous information encountering 一、引言 serendipity一词最初是由霍勒斯沃波尔创造的&#xff0c;他将其定义为“通过意外和睿智发现你并不追求的事物”。信息研究中大多数现有的偶然性定义从几个角度看…

LeetCode 第391场周赛个人题解

目录 哈沙德数 原题链接 思路分析 AC代码 换水问题 II 原题链接 思路分析 AC代码 交替子数组计数 原题链接 思路分析 AC代码 最小化曼哈顿距离 原题链接 思路分析 AC代码 哈沙德数 原题链接 思路分析 签到题&#xff0c;不说了 AC代码 class Solution:def s…

3月31号总结

java学习 一.面向对象之多态 什么是多态&#xff1a; 多态是在继承/实现情况下的一种现象。表现为对象多态、行为多态。 对象多态&#xff1a;一个对象可以有多种身份&#xff0c;比如一个人&#xff0c;可以是一个父亲&#xff0c;一个老师&#xff0c;或者等等。 行为多…

“‘悦’向新生,与‘榕’同行” 悦榕集团海外酒店中国区巡演圆满收官

三十周年盛会如约而至&#xff0c;来自25家海外酒店及地产代表亮相上海、深圳、成都3城 【中国上海&#xff0c;2024年3月29日】值此悦榕集团成立30周年之际&#xff0c;悦榕集团海外酒店中国区路演活动于上海、成都、深圳三地举行&#xff0c;旗下25家海外酒店和集团海外地产代…

Ch2 Posix IPC

2.1 概述 三种IPC均使用路径名进行标识。路径名既可以是系统中的实际路径名&#xff0c;也可不是&#xff0c;两者的不一致性可能带来移植性问题。 2.2 IPC名字 2.3 创建与打开IPC通道 2.4 IPC权限

milvus knowhere源码编译测试

简介 Knowhere 是 Milvus 的核心向量执行引擎&#xff0c;集成了Faiss、Hnswlib和Annoy等多个向量相似度搜索库。 编译环境 操作系统: Ubuntu 22.04.4 gcc/g:11.4.0 cmake: 3.27.7 安装依赖 apt install build-essential libopenblas-dev libaio-dev python3-dev python…

备考ICA----Istio实验12---配置双向TLS Istio Ingress Gateway实验

备考ICA----Istio实验12—配置双向TLS Istio Ingress Gateway实验 本实验部分配置延续上个Istio实验11 1. 重新配置secret 重新配置secret使其带有ca证书可以验证客户端证书是否合法 先删除原有secret,再配置新的secret # 删除原tls类型的secret kubectl -n istio-system d…

第四十六周:文献阅读+itransfomer

目录 摘要 Abstract 文献阅读&#xff1a;ITtransformer——转置transformer对时间序列预测的实用性 现有问题 提出方法 方法论 研究实验 实验目的 数据集 基线模型 实验结果 研究贡献 模型代码 总结 摘要 本周阅读的文献《Inverted Transformers are Effective…

海康威视【管理员】账号密码泄露【附Poc】

「企业介绍」 海康威视成立于2001年&#xff0c; 是一家专注技术创新的科技公司 &#xff0c;在安防、智能物联领域耕耘二十余年&#xff0c;业务覆盖全球150多个国家和地区。公司致力于将物联感知、人工智能、大数据技术服务于千行百业&#xff0c;引领智能物联新未来&#x…

【Python】——变量名的命名规则

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

2024长三角快递物流高质量创新发展论坛

2024长三角快递物流高质量创新发展论坛暨 2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09; 2024年7月8-10日 | 杭州国际博览中心 指导单位&#xff1a;浙江省邮政管理局 中国快递协会 主办单位&#xff1a;浙江省快递行业协会 联合主办&#xff1a;上…

【医学嵌入模型】中文医疗文本处理大模型 PCL-MedBERT

中文医疗文本处理大模型 PCL-MedBERT 提出背景对ELECTRA限制的深入分析eHealth的创新方法实体识别关系抽取 总结 最近再做医学项目&#xff0c;需要从文本中抽取医学概念和关系&#xff0c;通用模型的抽取效果还可以。 但还想找医学嵌入模型&#xff0c;能够更准确地从文本中识…

python---基础(一)

文章目录 前言1.对象的基本组成2.变量和常量2.1.变量的声明2.2.常量_链式赋值_系列解包赋值2.2.1.常量是不是真的常量&#xff1f;2.2.2.链式赋值2.2.3.系列解包赋值 3.内置数据类型_基本算数运算符3.1四种内置数据类型3.2.基本运算符3.3.divmod() 前言 这几年&#xff0c;随着…

Wasm初上手

总之也是为了扩宽技术面吧。。。我也不知道为什么就想试试了&#xff0c;就酱。 参考阅读&#xff1a;极客时间《WebAssembly入门课》 安装wasm的编译器Emscripten。Emscripten 是一个“源到源”语言编译器工具集&#xff0c;这个工具集可以将 C/C 代码编译成对应 JavaScript 代…

JavaScript 入门指南(三)BOM 对象和 DOM 对象

BOM 对象 BOM 简介 BOM&#xff08;browser Object Model&#xff09;即浏览器对象模型BOM 由一系列对象组成&#xff0c;是访问、控制、修改浏览器的属性的方法BOM 没有统一的标准&#xff08;每种客户端都可以自定标准&#xff09;。BOM 的顶层是 window 对象 window 对象 …

微机原理-基于8086电压报警器仿真系统设计

**单片机设计介绍&#xff0c;微机原理-基于8086电压报警器仿真系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086电压报警器仿真系统设计是一个综合了硬件和软件设计的复杂过程。以下是该设计概要的主要内容&…

TypeScript-自动编译

1.生成文件 tsc --init 2.修改配置文件 说明&#xff1a;通过CTRLF搜索到以下单词&#xff0c;进行修改。 "strict": true, //是否开启严格模式 "outDir": "./outFile", //表示ts文件最终编译为js文件&#xff0c;js文件存放的位置 3.新…