C语言-malloc(申请函数)free(释放函数)
malloc和free的语法格式
`malloc` 函数是 C 语言标准库中的一个重要函数,用于动态分配内存。其语法如下:
void *malloc(size_t size);
这里的 `void *` 表示返回的是一个 `void` 类型的指针,实际上这个指针指向的是一个 `char` 类型的内存块。`size_t` 是一个无符号整数类型,用于指定分配的内存大小。
当你调用 `malloc` 函数时,你需要提供一个参数 `size`,表示你需要分配的内存的大小(以字节为单位)。函数返回一个指针,指向为你分配的内存区域的开始位置。如果分配成功,这个指针不会是 `NULL`;如果分配失败(比如,系统没有足够的内存来满足请求),`malloc` 函数会返回 `NULL`。
在使用 `malloc` 分配的内存时,你需要使用 `memcpy`,`strcpy` 等函数来复制数据到这个内存区域,而不是 `strcpy`,`printf` 等函数,因为这些函数不适用于动态分配的内存。
在使用完动态分配的内存后,你应该使用 `free` 函数来释放内存,以避免内存泄漏。
free(void *ptr);
这里的 `ptr` 是之前 `malloc` 或其他动态内存分配函数(如 `calloc`,`realloc`)返回的指针。使用 `free` 后,指针所指向的内存将被释放,可以被系统重新分配给其他请求。但是,免费的内存不会立即变得可被其他程序使用,这是一个操作系统和硬件相关的过程。
这里是需要把这两个函数放到一起讲解的,因为申请内存空间你就得释放内存空间,不然会导致内存泄漏,内存泄漏会导致电脑内存里面可以使用的空间越来越少。最后导致崩盘。
———————————————————————————————————————————
malloc和free函数的使用
申请内存空间
返回函数 一定要做检查
头文件stdlib.h
perror打印出错误
动态内存的开辟空间都在堆区
释放内存
传递的参数 p就可以
解释一下
所以 此时释放的是自己的权限
但是需要知道的是 此时p也就是野指针了
所以此时我们把p栓到树上
也就是设置为空指针
———————————————————————————————————————————
这里开辟内存空间注意的三点(重点)
1
这里需要进行强制类型的转化因为从语法格式我们可以看出来,这里是的void*类型,也就是不明确的类型,为什么,因为C语言官方在设定的时候不清楚你开辟内存空间的目的是干什么用的,不知道是用于整数的存储,还是用于字符的打印,还是干什么。所以这里给出无返回类型,只需要你在使用的时候进行强制类型转化就可以。这样可以提升代码的兼容性和健壮性。
2.
对于空间的释放,释放空间之后尽量的让指针指向NULL,也就是空指针,因为当指针指向的空阿金释放之后,本质上他是不指向任何的数值了,也就是此时他是野指针了,虽然你不使用他了,但是最好指向空指针。防止内存的泄露
3.
使用空间的时候,你不能让指针跟着走,我们可以看到代码里面,
使用的是这个代码*(p+i)=I+1;。而不是*(p)=i;p++;这样的代码。
为什么,因为当指针走远之后,你进行释放空间的时候,本质上释放的是指针移动后指向的空间,你让指针一直移动,移动到开辟的空间的最后一个位置,然后再进行释放空间的时候,其实本质上释放的是开辟空间之后的空间,也就是没有释放空间。
你创建了空间,但是没有释放空间,此时会导致内存泄露。
内存泄露的问题我们也聊过,也就是内存占用少的时候还不明显,但是当有大量程序运行的时候,就会导致内存一直占用,但是得不到释放。从而导致崩盘。
4.
malloc函数里面放置的是字节大小,这里放置的是字节大小,不是bit大小,这里一定要记住。
———————————————————————————————————————————
malloc和free代码
int main()
{//malloc不初始化开辟空间//开辟20个字节的空间大小 int* p = (int*)malloc(5 * sizeof(int));if (p == NULL){perror("malloc:");//这里是打印错误信息,return 1;}for (int i = 0; i < 5; i++)//这里是打印出来开辟的空间 赋值之后进行打印 {*(p + i) = i + 1;//这里是进行赋值 赋值从1开始printf("%d ", *(p + i));//这里是打印出来}free(p);//这里进行指针的释放p = NULL;//防止野指针的问题,我们指向空指针return 0;
}
malloc第两种写法
可以是sizeof(int)=四个字节
然后5*sizeof(int)=20个字节
第二种就是上述的写法malloc(20)
相关文章:
C语言-malloc(申请函数)free(释放函数)
malloc和free的语法格式 malloc 函数是 C 语言标准库中的一个重要函数,用于动态分配内存。其语法如下: void *malloc(size_t size);这里的 void * 表示返回的是一个 void 类型的指针,实际上这个指针指向的是一个 char 类型的内存块。size_t …...
2024年150道高频Java面试题(十一)
21. 什么是 Java 中的内部类?它有哪些类型? Java 中的内部类是定义在另一个类内部的类。内部类能够访问其外部类的成员,包括那些声明为私有的成员。内部类是面向对象编程中的一个特色,可以用来逻辑上组织相关的类,并且…...
【MySQL】4.MySQL日志管理与数据库的备份和恢复
备份的目的只要是为了灾难恢复,备份还可以测试应用,回滚数据,修改和查询历史数据,审计等 日志在备份、恢复中起着重要作用 一、数据库备份的重要性 在生产环境中,数据的安全性至关重要 任何数据丢失都可能产生严重的…...
os模块篇(三)
专栏目录 文章目录 专栏目录os.putenv(key, value, /)os.setegid(egid, /)os.seteuid(euid, /)os.setgid(gid, /)os.setgroups(groups, /)os.setns(fd, nstype0)os.setpgrp()os.setpgid(pid, pgrp, /)os.setpriority(which, who, priority) os.putenv(key, value, /) os.puten…...
kvm虚拟机迁移--来自gpt
离线迁移 离线迁移KVM虚拟机主要涉及将虚拟机完全关闭,然后移动虚拟机的磁盘文件和配置文件到新的宿主机上,并在新宿主机上启动虚拟机。下面是具体的步骤和命令: 步骤 1: 关闭虚拟机 首先,在源宿主机上关闭目标虚拟机。确保虚拟…...
用Typora+picgo+cloudflare+Telegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南)
用TyporapicgocloudflareTelegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南) 前提:有github何cloudflare (没有的话注册也很快) 首先,是一个别人写的详细的配置流程,傻瓜式教程&am…...
鸿蒙TypeScript开发入门学习第3天:【TS基础类型】
1、TypeScript 基础类型 TypeScript 包含的数据类型如下表: 注意: TypeScript 和 JavaScript 没有整数类型。 2、Any 类型 任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。 1、变量的值会动态改变时&…...
gitee 本地文件提交到仓库
一、准备工作 1.下载Git Bash Git Bash官网下载地址 http://www.git-scm.com/download/ 点此跳转 2.注册或登录gitee gitee官网地址 https://gitee.com/ 点此跳转 没有账号选择注册有账号的话直接登陆 3.在gitee中新建一个空的仓库 登陆成功后点进个人主页,点击…...
TemperatureTop-kTop-p
一、温度 在语言模型中使用温度(temperature)这个参数是为了控制文本生成过程中的随机性和可预测性。这个概念来自于统计力学中的温度概念,在那里它用来描述系统的熵(或随机性)水平。在语言模型中,输出概率…...
HTTP 协议中常用的两种请求方法:get请求与post请求
一、get请求 (1)什么是 GET 请求? GET 请求是一种向服务器请求获取资源的方式。它通过 URL 将请求参数附加到请求中,并将请求发送给服务器。GET 请求通常用于获取数据,例如读取文章、获取用户信息等操作。 在Node.j…...
飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress
文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件,修改里面内容,然后重新启用export PATH$P…...
linux i2c-tools使用总结
1,安装iic-tools sudo apt install i2c-tools -y 2,查看有几条iic总线 [root@sino-platform:/root]# ls /dev/i2c- i2c-0 i2c-1 i2c-2 i2c-3 3,查看i2c命令 [root@sino-platform:/root]# i2c i2cdetect i2cdump i2cget i2cset 4,iic-help命令 [root@sino-platform…...
App推广新篇章:Xinstall助力精准分析与优化
在当前的移动应用市场中,App推广已成为每个开发者不可或缺的一环。然而,推广并非简单的投放广告与等待用户下载,而是需要一套科学、系统的分析与优化流程。这正是Xinstall作为国内专业的App全渠道统计服务商,能够为您带来的核心价…...
vue知识点: v-if和v-for为何不能同时使用?
在vue2和vue3的官方文档里都写到不推荐 v-if和v-for同时使用,如下代码所示: <li v-for"todo in todos" v-if"!todo.isComplete">{{ todo.text }} </li> 一、vue3文档:列表渲染 | Vue.js 在vue3中ÿ…...
2024.3.31力扣(1200-1400)刷题记录
一、1523. 在区间范围内统计奇数数目 1.模拟 class Solution:def countOdds(self, low: int, high: int) -> int:# 模拟return len(range(low,high1,2)) if low & 1 else len(range(low1,high1,2)) 2.数学 总结规律。首为偶数就向下取整;奇数就向上取整。…...
【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件
Red Hat 发布了一份“紧急安全警报”,警告称两款流行的数据压缩库XZ Utils(先前称为LZMA Utils)的两个版本已被植入恶意代码后门,这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094,其CVS…...
【Linux在程序运行时打印调用栈信息(函数名,文件行号等)】
在程序运行时打印相关调用栈信息(函数名,文件行号等),便于梳理调用逻辑等 //stack.c #include <stdio.h> #include <execinfo.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>#define MAX_…...
9.包和工具【go】
在Go语言中,包是代码的组织单元,而工具链则是Go语言提供的命令行工具,用于构建、测试和调试Go代码。下面我将详细介绍如何导入和使用标准库中的包,如何编写自己的包,以及如何使用Go的工具链。 导入和使用标准库中的包 Go的标准库包含了许多预定义的包,你可以通过导入这…...
判断一个字符串是否是真实手机号:JavaScript
一个简单的正则表达式示例,用于匹配中国大陆的手机号: function isValidPhoneNumber(phoneNumber) {// 定义一个正则表达式,用于匹配中国大陆的手机号const phoneRegex /^1[3-9]\d{9}$/;// 使用正则表达式测试手机号是否匹配return phoneReg…...
3D检测:从pointnet,voxelnet,pointpillar到centerpoint
记录centerpoint学习笔记。目前被引用1275次,非常高。 地址:Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint:三维点云目标检测算法梳理及最新进展(CVPR2021ÿ…...
使用canvas内置api完成图片的缩放平移和导出和添加提示
最近挺忙的,几乎没有时间去更新博客,今天正好在学习新东西,正好和大家分享一下。 最近要做一个使用canvas完成图片平移,缩放,添加标注的需求,完成的效果大概如下: 使用canvas内置api完成图片的缩…...
数据结构——二叉树——堆
前言: 在前面我们已经学习了数据结构的基础操作:顺序表和链表及其相关内容,今天我们来学一点有些难度的知识——数据结构中的二叉树,今天我们先来学习二叉树中堆的知识,这部分内容还是非常有意思的,下面我们…...
算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)
算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣(LeetCode) 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk: 每一对相…...
状态模式详解:管理对象状态的利器
在软件设计中,我们经常会遇到需要根据对象的不同状态来执行不同行为的情况。为了优雅地管理这些状态及其对应的行为,状态模式(State Pattern)应运而生。本文将深入探讨状态模式的使用条件、Java代码实现,并结合现实社会…...
探索----------------阿里云
目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1)内容分发网络CDN 2)专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化(五大负载) 1、cpu 使用率…...
Tidb和MySQL性能简单测试对比
一、单SQL性能对比 由于TiDB的并发能力优秀,但是单个SQL执行延迟较差,为了客观对比,所以只用1个线程来压测tidb和mysql,以观察延迟情况 二、并发SQL性能对比 TiDB:v6.5.2 MySQL:8.0.26 (单机) 三、结论 …...
2024.2.6力扣每日一题——魔塔游戏
2024.2.6 题目来源我的题解方法一 贪心优先队列 题目来源 力扣每日一题;题序:LCP 30 我的题解 方法一 贪心优先队列 思路:使用贪心的思想,从左到右遍历,若遇到加上当前房间的生命值后小于等于0,由于需要…...
C# OAuth单点登录的实现
原理 单点登录(Single Sign-On,简称SSO)是一种身份验证技术,它允许用户使用一组凭据(如用户名和密码)登录多个相关但独立的系统,而无需在每个系统中都进行登录操作。下面是一个简单的SSO实现示…...
AtCoder Beginner Contest 347 (ABCDEF题)视频讲解
A - Divisible Problem Statement You are given positive integers N N N and K K K, and a sequence of length N N N, A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\ldots,A_N) A(A1,A2,…,AN). Extract all elements of A A A that are multiples of K K K, divi…...
【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)
我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…...
学校网站建设工作方案/关键词排名关键词优化
所谓的死工资,其实是个相对的数值而不是绝对的,更多的时候指的是咱们一成不变的内心,和被社会职场打磨的毫无棱角的随波逐流。 1 今天下班回家,和往常无数个不加班的周五一样,差不多的时间,重复着差不多的故…...
网站开发算是固定资产吗/今日广州新闻头条
Camtasia是一款专业的屏幕录制和软件,用户可以通过它来录制自己的电脑屏幕,包括实时动画、PPT播放,兼以音频录制、视频制作等功能,支持用户一站式完成屏幕录制和后期处理操作。 自软件发行以来,Camtasia每个版本都在不…...
北海做网站哪家好/投广告的平台有哪些
查看默认iNode的默认大小 转载于:https://www.cnblogs.com/todayORtomorrow/p/10492502.html...
dw软件做的东西怎么在网站用/营销网站建设哪家快
2019独角兽企业重金招聘Python工程师标准>>> 队列:先进先出 栈:先进后出; 实现栈:有队列1有队列2。实现原理,始终保持一个队列为空队列。取元素时,将不为空的队列所有元素减一全部放入另外一个队列。将最后…...
嘉兴品牌网站建设/直接打开百度
最近做了一个小工具,里面涉及到一些取SQL Server 服务器信息的一些东西,找了好久,找到一个不错的,贴出来分享。 系统函数 SERVERPROPERTY ( propertyname ) 包含要返回的服务器属性信息的表达式。propertyname 可以是下列值之一&a…...
重庆活动轨迹公布/权威seo技术
前言可能很多小伙伴们都知道,在一般互联企业初期大多数都是采用手工打包上传与发布的方式进行代码发布,常见就是利用打包工具手工打包,上传到WEB服务器,备份原代码文件,发布新的代码,重启服务和检测是否发布…...