建设云南省癌症中心网站/微信软文范例大全100
1、malloc函数详解
(1)函数声明
#include <stdlib.h>
void* malloc(size_t size);
- malloc可以申请一定数量的空闲内存,这样的内存是匿名的,也就是malloc不会为其赋名,但是确实返回动态分配内存块的首元素地址,因此可以把该地址赋给一个指针变量,利用这个指针访问这块内存
- malloc通常返回一个char类型的指针,因为char表示一个字节。然而从ANSI C标准开始,C使用一个新的类型void*,即一个指向void的指针,相当于一个“通用指针”,由此malloc可以返回多个类型的指针。所以通常malloc的返回值都会强制转化为匹配的类型
- 把指向void的指针赋给任意类型的指针完全不需要考虑类型匹配的问题
- 如果malloc分配内存失败就会返回空指针
(2)使用函数
①使用malloc创建一个数组
double* ptd;
ptd = (double*)malloc(30 * sizeof(double));
if(ptd == NULL)//有可能不会分配到内存
{printf("Nunber not correctly entered -- bye");exit(EXIT_FAILURE);//程序异常终止程序
}
//某些使用ptd的程序
free(ptd);//用完后释放申请的空间,将内存还给计算机
ptd = NULL;//并且将还记住地址ptd指针置空
②使用注意事项
- 如果让ptd指向这块内存的首元素,便可以使用数组名一样使用它,也就是说可以使用ptd[0]、ptd[1]等指针用法
- ptd指向的是一个double类型的指针,而不是整个30个double类型的块
- 在C中不一定使用强制转化类型,但是在C++中必须使用,在C中使用强制类型转换更加容易把C程序转化为C++
- 最后两步是为了避免内存泄露的问题(后面会提到)
③三种创建数组的方式
- 声明数组,直接用常量表达式表达数组的维度,用数组名访问数组的元素,可以用静态内存或自动内存创建这种数组
- 声明变长数组(C99新增特性),用变量表达式表达数组的维度,具有这种特性的数组只能在自动内存中存储
- 声明一个指针,调用malloc函数,将其返回值赋给指针,使用这个指针访问数组的元素,该指针可以是静态的或自动的
2、free函数详解
(1)函数声明
#include <stdlib.h>
void free(void *ptr);
- free通常都会搭配malloc使用,free的参数是之前mlloc返回的地址,该函数释放之前malloc分配的一块内存。不能使用free释放其他方式(例如声明一个数组后使用free)
- 这样配套使用的话,malloc分配内存,free释放内存,可以重复利用一块内存空间(内存池)
(2)使用函数
double* ptd;
ptd = (double*)malloc(30 * sizeof(double));
free(ptd);
ptd = NULL;
3、exit函数详解
(1)函数声明
#include <stdlib.h>
void exit(int status);
- 如果malloc函数分配内存失败,可以调用函数exit结束程序
- status是返回给父进程的状态值。标准提供了两个返回值(被定义在stdlib.h中)保证在所有的操作系统中都能正常工作,一些操作系统还会接受一些表示其他运行错误的整数值
- EXIT_FAILURE表示程序异常终止
- EXIT_SUCCESS(相当于0)表示普通的程序结束
(2)使用函数
int sum = 0;
if(scanf("%d", &sum) != 1)
{printf("Nunber not correctly entered -- bye");exit(EXIT_FAILURE);
}
4、内存泄露的危害
void function(int n)
{double* temp = (double*)malloc(n * sizeof(double));/*假设忘记使用函数free()*/
}
int main()
{for(inţ i = 0; i < 1000000)function(1000000);
}
如果没有使用free函数将malloc申请的内存释放的话1000000*1000000就有可能将所有内存耗尽,这类问题就被称为内存泄露,在函数末尾调用free函数可以避免这类问题。
5、动态内存分配和变长数组的区别
- 动态内存分配malloc和变长数组(VLA)在功能上有点重合,比如两者都可以用于创建在运行时才确定大小的数组
- 不同的是,变长数组是自动存储类型。因此程序在离开变长数组定义的块的时候,变长数组占有的空间会被自动释放,不必使用free函数
- 另外一方面,free所用的指针变量可以与malloc函数的指针变量不同,但是两个指针必须存储相同的地址,并且不能释放两次
- 对多维数组来说,使用VLA在语法上更加的方便,使用malloc就会显得复杂得多
int n = 5, m = 6;int ar2[n][m];//变长数组(要求支持VLA)int (* p2)[6];//指向一个6元素数组的指针,使用变量p2存储
int (* p3)[m];//指向一个m元素数组的指针,使用变量p3存储(要求支持VLA)
p2 = (int (*)[6])malloc(n * 6 * sizeof(int));//n*6数组
p3 = (int (*)[m])malloc(n * m * sizeof(int));//n*m数组(要求支持VLA)
6、存储类别和动态内存分配
(1)简单分类内存
可以简单认为程序把它可用的内存分为3部分:
- 供给具有外部链接、内部链接和无连接的静态变量使用
- 供给自动变量使用
- 供给动态内存分配使用(内存堆/堆/自由内存)
(2)三类内存的细节
- 静态存储类别的变量,使用的内存数量在编译的时候就确定,只要程序还在运行,就可以访问存储在该部分的数据。该类别的变量在程序开始执行时就被创建,在程序结束的时候被销毁
- 自动存储类别的变量,在程序进入变量定义的块时存在,程序离开块的时候消失。因此,随着程序调用函数和函数结束,自动变量所用的内存数量也在相应的增加或减少。这部分的内存通常作为栈来处理,这意味着新创建的变量按顺序加入内存,然后以相反的顺序销毁
- 动态分配的内存,在调用malloc函数或相关函数的时候存在,在调用free函数后释放,这一部分的内容由程序员管理,而不是某套规则。另外,未使用的内存块分散在已使用的内存块之间,使用动态内存通常比使用栈内存慢
相关文章:

存储类别、链接与内存管理(三)
1、malloc函数详解 (1)函数声明 #include <stdlib.h> void* malloc(size_t size);malloc可以申请一定数量的空闲内存,这样的内存是匿名的,也就是malloc不会为其赋名,但是确实返回动态分配内存块的首元素地址&a…...

Java:Linux(CentOS)安装、配置及相关命令
目录一、VMware安装二、CentOS安装1、安装过程2、加载ISO2.1 桌面的设置三、VI/VIM编辑器1、一般模式2、编辑模式3、命令模式4、模式间转换四、网络配置和系统管理操作1、配置子网IP和网关2、配置虚拟机ip地址2.1 ifconfig 查询ip地址2.2 修改IP地址3、配置主机名3.1 hostname …...

Linux 操作系统原理 — 多任务优先级调度策略
目录 文章目录 目录多任务优先级调度策略User Process 调度策略配置调整 User Process 的优先级调整非实时进程的优先级调整实时进程优先级调整 User Process 的调度算法多任务优先级调度策略 在 Linux Kernel 中,Kernel Thread 作为唯一的调度实体,Kernel Scheduler(调度程…...

链表学习之找到两个链表相交的第一个节点
链表解题技巧 额外的数据结构(哈希表);快慢指针;虚拟头节点; 找到两个链表相交的第一个节点 给定两个链表,这两个链表可能有环,可能无环。判断这两个链表是否相交,相交则返回第一…...

【Kubernetes】【十一】Pod详解 Pod的生命周期
Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程: pod创建过程 运行初始化容器(init container)过程 运行主容器(main container) 容器启动后钩子&#…...

Connext DDS录制服务 Recording Service(1)
1 序言 1.1 简介 RTI记录服务包括以下工具: •记录服务,一种RTI Connext DDS应用程序,用于记录主题和发现数据。记录服务记录数据更新以及时间戳,因此您可以查看或回放系统中随时间发生的数据更新。默认情况下,记录的数据存储在SQLite文件中。录制服务还具有一个API,用于…...

vTESTstudio - VT System CAPL Functions - VT2004(续2)
不要沮丧,不必惊慌,做努力爬的蜗牛或坚持飞的笨鸟,我们试着长大,一路跌跌撞撞,哪怕遍体鳞伤。vtsSetPWMVoltageLow - 设置PWM输出上的低电压功能:指定数字输出信号(尤其是PWM信号)输…...

每天一个linux命令---awk
awk命令 1. 简介 awk是一种处理文本文件的语言,是一个强大的文本分析工具,grep、sed、awk并称为shell中文本处理的三剑客。 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&am…...

Open3D 点云旋转之轴角式(Python版本)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 三维空间中表示旋转的方法有很多种,轴角式是其中非常经典的一种表示方式。虽然欧拉角表示旋转的方法很是常用,但欧拉角存在着万向锁这个问题,因此轴角式旋转在旋转使用中更为合适。其原理也很是明了,如下所述:…...

Error: Timeout trying to fetch resolutions from npm
文章目录问题描述【最终解决】我搜索到的解决方案npmjs 该依赖各版本列表及对应的被下载次数github issue 说降级到0.0.3就可以正常运行了SOF 也说降级别到0.0.3问题描述 在项目里用到了 "preinstall": "npx npm-force-resolutions"配置,在一台…...

Python基础3
目录 1. 函数多返回值 2. 函数多种传参方式 3. 匿名函数 3.1 函数作为参数传递 3.2 lambda匿名函数 4. 文件的读取操作 4.1 open()打开函数 4.2 读操作方法 4.3 文件的写入 4.4 文件的追加 5. 异常的捕获方法 5.1 捕获常规异常 5.2 捕获指定…...

高可用集群(HAC)
1、高可用集群keepalive说明 高可用定义: 目的:尽可能的提高服务的可用性 99%、99.9%、99.99%、99.999% 实现原理:心跳检测服务: 有状态: MySQL 无状态: apacheLVS Keepalive原理 案例环境专为 LVS和…...

python基于django微信小程序的适老化老人健康预警小程序
随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代, 适老化老人健康预警微信小程序就是信息时代变革中的产物之一。 任何系统都要遵…...

基于微信小程序图书馆管理系统
开发工具:IDEA、微信小程序服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7前端技术:vue、uniapp服务端技术:springbootmybatis-plus本系统分微信小程序和管理后台两部分,项…...

将镭神C32激光雷达的PointXYZ数据转化为PointXYZIR格式 - 附代码
之前遇到过“镭神32线激光雷达ROS下运行fromRosMsg()报错 Failed to find match for field “intensity“ 问题”, 当时确定了是镭神C32雷达缺少相应字段,并记录博客【学习记录】镭神32线激光雷达ROS下运行fromRosMsg()报错 Failed to find match for fi…...

高级前端一面面试题集锦
详细说明 Event loop 众所周知 JS 是门非阻塞单线程语言,因为在最初 JS 就是为了和浏览器交互而诞生的。如果 JS 是门多线程的语言话,我们在多个线程中处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程中删除节点&#…...

Java基础 -- List集合
Java基础 -- List集合1. Introduction1.1 好处1.2 常用泛型2. 交集,差集等2.1 自身的方法2.2 1.8jdk stream 新特性2.3 Apache的CollectionUtils工具类(推荐)3. 限定泛型范围4. Awakening1. Introduction 1.1 好处 代码复用,多种…...

【Linux】网络编程 - Socket套接字/基于UDP的网络通信
目录 一.套接字 1.什么是套接字/Socket套接字 2.套接字的分类 3.Socket套接字的常见API 二.网络字节序 1.什么是网络字节序 2.网络字节序和主机字节序的转换接口 三.IP地址形式上的转换 四.客户端的套接字不由程序员bind 1.为什么客户端套接字不能由程序员bind 2.OS…...

流程引擎之Camunda简介
背景Camunda 是支持 BPMN(工作流和流程自动化)、CMMN(案例管理) 和 DMN(业务决策管理) java 框架。Camunda 基于Activiti5 保留了 PVM,其开发团队也是从 activiti 中分裂出来的。Camunda 来自拉…...

Mybatis笔记整理
1. 相关文档地址 中文文档 https://mybatis.org/mybatis-3/zh/index.htmlMybatis可以配置成适应多种环境,不过每个SqlSessionFactory实例只能选择一种环境。Mybatis默认事务管理器是JDBC,连接池:POOLEDMaven仓库:下载地址<dependency>…...

【react全家桶】面向组件编程
文章目录02 【面向组件编程】1.组件的使用1.1 函数式组件1.2 类式组件1.3 组合组件1.4 提取组件组件实例的三大属性 state props refs2.state2.1 基本使用2.2 setState()2.3 简化版本2.4 State 的更新可能是异步的2.5 异步更新解决方案2.6 数据是向下流动的3.props3.1 基本使用…...

Django框架之模型视图-使用 PostMan 对请求进行测试
使用 PostMan 对请求进行测试 PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件,可以直接去对我们写出来的路由和视图函数进行调试,作为后端程序员是必须要知道的一个工具。 安装方式1:去 Chrome 商店直接搜索 PostMan…...

(考研湖科大教书匠计算机网络)第五章传输层-第四节:TCP流量控制
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:流量控制概述二:流量控制举例三:拓展阅读(可不看)(1)TCP流量控制完整例子&a…...

使用Docker-Compose搭建Redis集群
1. 集群配置3主3从由于仅用于测试,故我这里只用1台服务器进行模拟redis列表2.编写redis.conf在server上创建一个目录用于存放redis集群部署文件。这里我放的路径为/root/redis-cluster 在/opt/docker/redis-cluster目录下创建redis-1,redis-2,redis-3,redis-4,redis…...

华为OD机试 -计算网络信号(Js)
计算网络信号 题目 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。 注意:网络信号可以绕过阻隔物 array[m][n] 的二维数组代表网格地图,array[i][j] = 0代表 i 行 j 列是空旷位置;array[i][j] = x(x 为正整数)代表 i 行 …...

【数据结构】————栈
文章目录前言栈是什么,栈的特点实现栈的基本操作栈的相关操作声明1.创建栈2.对栈进行初始化3.销毁栈4.判断栈是否为空5.压栈操作6.删除栈顶元素7.取出栈顶元素8.计算栈内存放多少个数据总结前言 本文主要讲述特殊的线性表——栈: 栈是什么,栈…...

从零编写linux0.11 - 第十一章 可执行文件
从零编写linux0.11 - 第十一章 可执行文件 编程环境:Ubuntu 20.04、gcc-9.4.0 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 本章目标 本章会加载并运行…...

Win10上通过nginx代理配置远程非445端口SMB
引言 家里架了一个SMB文件服务器,想要远程访问,开了445端口,但仅限某些特殊网络可以远程访问,其他网络全部拒绝445端口,因此网上找了很多将Win10的SMB指向别的端口的教程,但所有教程均使用环回网卡解决&am…...

Allegro如何快速清除多余的规则设置操作指导
Allegro如何快速清除多余的规则设置操作指导 在用Allegro做PCB设计的时候,会给PCB设置一些规则,在PCB设计完成之后,可能会有一些没有使用到的规则,如下图 Physical规则中的45OHM的规则是多余的 单独某个规则可以直接在规则管理器中删除,如果比较多可以用下面方法批量删除…...

ROS2 入门应用 引用自定义消息(Python)
ROS2 入门应用 引用自定义消息(Python)1. 查看自定义消息2. 修改话题发布3. 修改话题订阅4. 修改依赖关系5. 编译和运行1. 查看自定义消息 引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg ros2 interface show tutorial_interfaces/…...