C语言----内存函数

news/发布时间2024/5/16 1:36:17

内存函数主要用于动态分配和管理内存,它直接从指针的方位上进行操作,可以实现字节单位的操作。

其包含的头文件都是:string.h

memcpy

copy block of memory的缩写----拷贝内存块

格式:

void *memcpy(void *dest, const void *src, size_t num);

作用:与strcpy类似,但是从内存的角度从source的位置开始向后复制num个字节的数据到destination指向的内存位置。

要求:

• 这个函数在遇到 '\0' 的时候并不会停下来。也就是说如果在数据中间插入 ‘\0’ 是不会停下复制进程的。

• 如果source和destination有任何的重叠,复制的结果都是未定义的。

• 鉴于拷贝的类型不一,使用*void来表示任意类型。

• num的单位是字节

实例:

int main()
{char arr1[20] = "hello world";char arr2[20] ;memcpy(arr2, arr1,strlen(arr1)+1);//需要复制的字节数为arr1的长度加上字符串结束符'\0'printf("%s", arr2);return 0;
}

 

int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };//将arr1中的4 5 6 7 8,拷贝到arr2中memcpy(arr2, arr1+3, 5 * sizeof(int));//可以拷贝数组中的任意数据int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

模拟实现:

void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;while (num--)//根据所要复制的字节数进行递减直到复制完成{assert(dest && src);*(char*)dest = *(char*)src;dest = (char*)dest+1;src = (char*)src + 1;}return (ret);
}

memmove

move block of memory的缩写----内存体转移

格式

void * memmove ( void * destination, const void * source, size_t num );

作用与要求

和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。由于该特性,实际上memmove比memcpy更加实用,兼容性也更强。

实例:

int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);//20个字节就是五个整型,在这里arr1+2也就是从3开始拷贝1,2,3,4,5五个数字int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}//打印出的结果是1,2,1,2,3,4,5,8,9,10(因为arr1的空间只够放下十个整型,并且mommove是允许重叠内存空间的)

模拟实现:

void* my_memmove(void* dest, const void* src, size_t n) 
{unsigned char* d = (unsigned char*)dest;const unsigned char* s = (const unsigned char*)src;if (s < d && s + n > d) {// 如果源地址在目标地址之前且重叠for (size_t i = n; i > 0; i--) {d[i - 1] = s[i - 1];}} else {// 普通情况下的复制for (size_t i = 0; i < n; i++) {d[i] = s[i];}}return dest;
}

memset

set block of memory的缩写----填充设置内存块

格式

void * memset ( void * ptr, int value, size_t num );

作用:memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。同时在重叠内存空间时实现覆盖原内容。

要求:

• 使用memset函数时需要谨慎,确保不会意外覆盖原有的数据。

实例:

int main() 
{char str[] = "almost every programmer should know memset!";memset(str, '-', 6);printf(str)return 0;
}//结果是 ------ every programmer should know memset!
//也就是说将almost覆盖

模拟实现:

void* my_memset(void* ptr, int value, size_t num) 
{unsigned char* p = (unsigned char*)ptr;for (size_t i = 0; i < num; i++) {p[i] = (unsigned char)value;}return ptr;
}

memcmp

compare block of memory的缩写----比较内存块

作用:与strcmp类似,⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节,参照下表:

注意:同strcmp不同的是,memcmp可以比较内存区域的大小,具体参照下方实例。

实例:

int main()
{char ned1[] = "dsdsdssdds1";char ned2[] = "dsdsdssdds2";int n;n = memcmp(ned1, ned2, 44);printf("%d", n);return 0;
}

模拟实现:

int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{//比较内存区域大小const unsigned char* p1 = (const unsigned char*)ptr1;const unsigned char* p2 = (const unsigned char*)ptr2;for (size_t i = 0; i < num; i++) {if (p1[i] < p2[i]) return -1;if (p1[i] > p2[i]) return 1;}return 0;
}

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

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

相关文章

Leo赠书活动-16期 名校毕业生教材

Leo赠书活动-16期 名校毕业生教材 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠…

LeetCode JS专栏刷题笔记(一)

一、前言 LeetCode 在前不久出了一个 JavaScript 专栏&#xff0c;这个专栏一个目的是为了非前端工程师学习 JS&#xff0c;另一个是为了前端工程师提升 JS 能力。 因此在这个专栏中&#xff0c;基本不涉及什么具体算法问题&#xff0c;都是一些 JS 的入门语法与常见的 JS 面…

Android13 针对low memory killer内存调优

引入概念 在旧版本的安卓系统中&#xff0c;当触发lmk&#xff08;low memory killer&#xff09;的时候一般认为就是内存不足导致&#xff0c;但是随着安卓版本的增加lmk的判断标准已经不仅仅是内存剩余大小&#xff0c;io&#xff0c;cpu同样会做评判&#xff0c;从而保证设备…

基于 Python 深度学习的电影评论情感分析系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

总结:Mybatis报错Invalid bound statement (not found)

目录 1、Mapper.xml中mapper namespace路径不准确 2、TextDao&#xff08;接口&#xff09;与TextMapper.xml id标签不一致 ​编辑 3、application.properties中配置mybatis.type-aliases-packagecom.demo.entity需要与Text实体类路径一致 4、pom.xml文件中需要配置<res…

adobe软件提示This non-genuine Adobe app will be disabled soon【软件版本】

因为电脑上级路由器装了小飞机&#xff0c;导致本机电脑ps等adobe的系列软件出现了 This non-genuine Adobe app will be disabled soon&#xff0c;烦人的狠&#xff0c;之前有写过一篇通过更改host的教程&#xff0c;现在已经失效了&#xff0c;今天为大家分享一个用软件来屏…

关于数据结构的定义以及基本的数据结构

在计算机科学中&#xff0c;数据结构是指用于组织和存储数据的方式或方法。它涉及到在计算机内存中存储、管理和操作数据的技术和原则。数据结构不仅仅是简单地存储数据&#xff0c;还可以提供高效的数据访问和操作方式&#xff0c;以满足特定的需求。 以下是每个数据结构的详细…

ubuntu屏幕小的解决办法

1. 安装vmware tools , 再点自适应客户机 执行里面的vmware-install.pl这个文件 &#xff1a;sudo ./vmware-install.pl 执行不了可以放到家目录&#xff0c;我放在了/home/book 里面 最后点这个自适应客户机 然后我这里点不了是因为我点了控制台视图和拉伸客户机&#xff0c…

个人简历补充

个人简历补充 1.对工作的认识2.八股文和知识面3.框架/架构角度深扒3.1 前端3.1.1 mPaaS&#xff08;移动领域&#xff09;3.1.2 普通前端项目框架3.1.3 微前端 3.2 后端 持续更新 1.对工作的认识 2.八股文和知识面 前端&#xff08;基础知识 / 开发能力 / 总结输出能力&#xf…

electron桌面开发相关注意点

electron的部署以及配置 如果使用的是pnpm&#xff0c;请先配置一下镜像&#xff0c;否则会安装失败的&#xff1a; pnpm config set registryhttps://registry.npmmirror.com pnpm config set electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ pnpm config set …

【Linux】进程间通信——共享内存

文章目录 共享内存的概要创建共享内存shmget()参数keyshmget()参数sizeshmget()参数shmflg 删除共享内存挂载共享内存去关联 共享内存的概要 共享内存允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。不同进程之间…

用阿里云一键部署了幻兽帕鲁服务器,怎么一键切换成雾锁王国服务器?

之前用阿里云一键部署的幻兽帕鲁服务器&#xff0c;现在不想玩了&#xff0c;想要换成雾锁王国服务器&#xff0c;该怎么操作呢&#xff1f; 操作方法如下&#xff1a; 首先打开你的阿里云计算巢&#xff0c;之前你买过的一键部署幻兽帕鲁服务实例&#xff0c;这里应该可以看…

Ansible的脚本 --- playbook 剧本

目录 playbook的简介 什么是playbook playbook组成 应用实例 Templates 模块 tags 模块 Roles 模块 playbook的简介 什么是playbook Ansible Playbook 是设定自动化任务的一种蓝图&#xff0c;可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playboo…

Zig、C、Rust的Pk1

Zig、C、Rust的Pk1 github.com上看到“A basic comparitive analysis of C, C, Rust, and Zig.”&#xff1a;https://github.com/CoalNova/BasicCompare/tree/main 里边的代码是9个月之前的&#xff0c;用现在的zig 0.11.0 及0.12-dev都无法通过编译(具体为&#xff1a;zig-w…

【MATLAB源码-第140期】基于matlab的深度学习的两用户NOMA-OFDM系统信道估计仿真,对比LS,MMSE,ML。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 深度学习技术在无线通信领域的应用越来越广泛&#xff0c;特别是在非正交多址接入&#xff08;NOMA&#xff09;和正交频分复用&#xff08;OFDM&#xff09;系统中&#xff0c;深度学习技术被用来提高信道估计的性能和效率。…

【JavaEE】_CSS选择器

目录 1. 基本语法格式 2. 引入方式 2.1 内部样式 2.2 内联样式 2.3 外部样式 3. 基础选择器 3.1 标签选择器 3.2 类选择器 3.3 ID选择器 4. 复合选择器 4.1 后代选择器 4.2 子选择器 4.3 并集选择器 4.4 伪类选择器 1. 基本语法格式 选择器若干属性声明 2. 引入…

Jmeter 分布式压测

‍你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子&#xff0c;它模拟了同时有 5000 个用户&#xff0c;循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 结果分析 但是&#xff0c;实际企业中&#xff0c;这种压测方式根本不满足实际需求。下面介…

npm run dev运行出现NODE_OPTIONS=--max_old_space_size=4096 vite --mode dev --host?

问题描述 PS E:\AWorkDataease\DataEase\core\core-frontend> npm run dev dataease0.0.0 dev NODE_OPTIONS–max_old_space_size4096 vite --mode dev --host 0.0.0.0 ‘NODE_OPTIONS’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 解决方案 遇到…

【深度学习笔记】深度学习训练技巧——超参数选取

超参数选取 超参数 超参数: 控制算法行为&#xff0c;且不会被算法本身所更新&#xff0c;通常决定了一个模型的能力 对于一个深度学习模型, 超参数包括 层数&#xff0c;每层的神经元数目正则化系数学习率参数衰减率&#xff08;Weight decay rate&#xff09;动量项&#xff…

Linux第60步_“buildroot”构建根文件系统第2步_配置“buildroot下的busybox”并测试“buildroot”生成的根文件系统

1、查看“buildroot下的busybox”安装路径 打开终端 输入“ls回车” 输入“cd linux回车/”&#xff0c;切换到到“linux”目录 输入“ls回车”&#xff0c;查看“linux”目录下的文件和文件夹 输入“cd buildroot/回车”&#xff0c;切换到到“buildroot”目录 输入“ls…
推荐文章