【C语言】静动态内存的跨函数访问malloc、free

目录
  • 多指针初认识:
  • 动态内存和多级指针的跨函数访问
  • 动态内存和静态内存的比较:
  • 静态内存不可以跨函数访问:
  • 动态内存跨函数访问:
  • malloc和free示例

多指针初认识:

#include <stdio.h>
#include <stdlib.h>
int main()
{int i = 100;int *p = &i;int **q = &p;int ***r = &q;//r = &p;   //error 因为r是 int*** 类型,r只能存放 int** 类型变量的地址printf("i = %d\n",***r);	system("pause");return 0;
}

输出结果:

i = 100

动态内存和多级指针的跨函数访问

#include <stdio.h>
#include <stdlib.h>void f(int **p)
{*p = 10;
}int main()
{int *p = (int *)malloc(4);f(&p);	printf("*p = %d\n",p);system("pause");return 0;
}

输出结果:

*p = 10

动态内存和静态内存的比较:

静态内存是由系统自动分配,由系统自动释放

静态内存是在栈分配的

动态内存由程序员手动分配,手动释放

动态内存是在堆分配的

静态内存不可以跨函数访问:

通俗说就是:当被调用的函数结束后,被调用函数里面的静态内存不能被其他函数访问。

#include <stdio.h>
#include <stdlib.h>void f(int **q)
{int i = 10;//*q等价于p  q和**q都不等价于p//*q =i;//error 因为*q = i等价于p = i;这样写是错误的*q = &i;   //等价于 p = &i;
}int main()
{int *p;f(&p);printf("%d\n",*p);	//本语句语法没有问题,但是逻辑上有问题system("pause");return 0;
}

输出结果:

10

这个程序运行是能正常输出的,但是程序是错误的,逻辑上有错误。

因为当 f( ) 函数执行完毕之后,函数终结(也就是函数的出栈),此时函数静态分配的变量的空间会被全部释放,静态变量的空间访问权限会还给操作系统,我们不能再对他进行读写操作。具体到这个 f( ) 函数就是 ,变量 q 没了,变量 i 没了, i 的值 10 也没有了。也可以说 p 指向 的 变量 i 的空间没了。

那么main 函数 就不能访问 i 的值,也就是 printf("%d\n",*p) 中的 *p 逻辑上是不可以的。

但是 指针P 可以存放着 i 的地址。但是不能访问 i 的空间,没有权限进行读写操作。

动态内存跨函数访问:

malloc堆分配的动态内存,不会随着函数的结束而被释放,只有手动free才会被释放

#include <stdio.h>
#include <stdlib.h>void f(int **q)
{*q = (int *)malloc(sizeof(int));  //等价于 p=(int *)malloc(sizeof(int)) //q = 10;    //error//*q = 10;   //等价于  p = 10;**q = 10;    //等价于 *p = 10;
}int main()
{	int *p = (int *)malloc(4);f(&p);    printf("*p = %d\n",*p);system("pause");return 0;
}

输出结果:

*p = 10

malloc和free示例

malloc

malloc(Memory Allocation)是一个C语言中的标准库函数,用于动态分配内存空间。它的声明在 <stdlib.h> 头文件中。

void *malloc(size_t size);
  • 参数: size 表示要分配的字节数,即所需的内存空间大小。
  • 返回值: 返回一个指向新分配内存的指针。如果分配失败,返回 NULL

动态内存分配可以帮助你在程序运行时根据需要动态地分配内存,而不是在编译时确定固定的内存大小。这在处理不确定数量的数据或在运行时动态生成数据结构时非常有用。

使用 malloc 的基本示例:

#include <stdio.h>
#include <stdlib.h>int main() {int *arr;int size = 5;// 分配内存空间,大小为 size * sizeof(int) 字节arr = (int *)malloc(size * sizeof(int));if (arr == NULL) {// 内存分配失败printf("Memory allocation failed\n");return 1;}// 在分配的内存中进行操作for (int i = 0; i < size; i++) {arr[i] = i * 2;}// 打印结果for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}// 释放内存free(arr);return 0;
}

在使用 malloc 后,务必使用 free 函数释放已分配的内存,以避免内存泄漏。如果你的程序使用了动态分配的内存,确保在不再需要这些内存块时释放它们。否则,可能会导致内存占用过多,最终导致程序崩溃。

free

在C语言中,free 是一个用于释放动态分配内存的标准库函数,声明在 <stdlib.h> 头文件中。它的使用非常简单,通常与 malloccallocrealloc 配合使用。

void free(void *ptr);
  • 参数: ptr 是一个指向先前由 malloccallocrealloc 返回的指针,该指针指向要释放的内存块。

示例:

#include <stdio.h>
#include <stdlib.h>int main() {int *arr;// 分配内存空间arr = (int *)malloc(5 * sizeof(int));if (arr == NULL) {printf("Memory allocation failed\n");return 1;}// 在分配的内存中进行操作for (int i = 0; i < 5; i++) {arr[i] = i * 2;}// 打印结果for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}// 释放内存free(arr);// 将指针置为 NULL,以避免野指针arr = NULL;return 0;
}

在上述例子中,malloc 被用来分配一个包含 5 个整数的内存块。使用完这块内存后,我们通过调用 free(arr) 来释放这块内存。在释放后,为了避免野指针的问题,我们将指针 arr 置为 NULL

记住,在使用 free 之后,被释放的内存块不再属于程序,因此在后续的代码中尽量避免使用已经释放的内存。释放内存的好习惯可以防止内存泄漏,提高程序的健壮性。

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

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

相关文章

技术查漏补缺(1)Logback

一、下定义&#xff1a;Logback是一个开源的日志组件 二、Logback的maven <!--这个依赖直接包含了 logback-core 以及 slf4j-api的依赖--> <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><v…

新手解锁语言之力:理解 PyTorch 中 Transformer 组件

目录 torch.nn子模块transformer详解 nn.Transformer Transformer 类描述 Transformer 类的功能和作用 Transformer 类的参数 forward 方法 参数 输出 示例代码 注意事项 nn.TransformerEncoder TransformerEncoder 类描述 TransformerEncoder 类的功能和作用 Tr…

vite + vue3引入ant design vue 报错

npm install ant-design-vue --save下载插件并在main.ts 全局引入 报错 解决办法一&#xff1a; main.ts注释掉全局引入 模块按需引入 解决办法二 将package.json中的ant-design-vue的版本^4.0.0-rc.4改为 ^3.2.15版本 同时将将package-lock.json中的ant-design-vue的版本…

Android13 热点默认5G频道配置修改

Android13 热点默认5G频道配置修改 文章目录 Android13 热点默认5G频道配置修改一、前言二、修改默认配置1、代码中修改默认配置2、保存默认配置文件设置默认5G频段配置热点配置文件完整信息示例&#xff1a; 3、代码中强制设置配置信息&#xff08;1&#xff09;在关键流程设置…

Graceful Response 构建 Spring Boot 下优雅的响应处理

一、Graceful Response Graceful Response 是一个 Spring Boot 技术栈下的优雅响应处理器&#xff0c;提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能&#xff0c;使用Graceful Response进行web接口开发不仅可以节省大量的时间&#xff0c;还可以提高代码质…

小白综述:深度学习 OCR 图片文字识别

文章目录 1. OCR 算法流程1.1 传统 OCR 方法1.2 深度学习 OCR 方法1.2.1 two-stage方法&#xff1a;文字检测识别1.2.2 端到端方法 2. 文本检测算法3. 文本识别算法3.1 基于分割的单字符识别方法3.2 基于序列标注的文本行识别方法 1. OCR 算法流程 OCR (Optical Character Rec…

揭开 JavaScript 作用域的神秘面纱(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

简单vlan划分和dhcp中继(Cisco Packet Tracer模拟)

文章目录 1. 前言2. 功能实现2.1. dhcp服务器接入2.2. 学校web服务器2.3. 设置学校dns服务器2.4. 设置线路冗余2.5. 配置ac。 1. 前言 在这里我们的计网作业是使用思科的Cisco Packet Tracer进行对校园网的简单规划&#xff0c;这里我对校园网进行了简单的规划&#xff0c;功能…

前端页面的生命周期

性能问题呈现给用户的感受往往就是简单而直接的&#xff1a;加载资源缓慢、运行过程卡顿或响应交互延迟等。而在前端工程师的眼中&#xff0c;从域名解析、TCP建立连接到HTTP的请求与响应&#xff0c;以及从资源请求、文件解析到关键渲染路径等&#xff0c;每一个环节都有可能因…

django websocket实现聊天室功能

注意事项channel版本 django2.x 需要匹配安装 channels 2 django3.x 需要匹配安装 channels 3 Django3.2.4 channels3.0.3 Django3.2.* channels3.0.2 Django4.2 channles3.0.5 是因为最新版channels默认不带daphne服务器 直接用命令 python manage.py runsever 默认运行的是w…

K8S中的hostPort、NodePort 、targetPort、port、containerPort 的区别

Dockerfile的EXPOSE Dockerfile中端口的声明: EXPOSE <端口1> [<端口2>...] 所以:EXPOSE的 第一个作用:只是说明docker容器开放了哪些端口,并没有将这些端口实际开放了出来!更多的作用是告诉运维人员或容器操作人员我开放了容器的哪些端口,只是一种说明。 …

WEB前端知识点整理(JQUERY+Bootstrap+ECharts)

1.JQUERY的概述&#xff1a; jQuery 是一个 JavaScript 库。jQuery 极大地简化了JavaScript 编程&#xff0c;它很容易学习。 jQuery库包含以下功能&#xff1a;HTML 元素选取&#xff1b;HTML 元素操作&#xff1b;CSS 操作&#xff1b;HTML 事件函数&#xff1b;JavaScript …

技术学习|CDA level I 业务分析方法

业务分析方法有三个主要构成部分&#xff1a;业务指标分析、业务模型分析及业务分析方法。 业务指标分析是发现业务问题的核心方法&#xff1a;用于通用指标和场景指标的计算及分析方法&#xff0c;以及指标体系的设计与应用方法。业务模型是从一系列业务行为中抽象出来的信息…

250:vue+openlayers 加载geotiff文件,并在地图上显示

第250个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载geotiff文件,并在地图上显示。这里使用到了WebGLTile图层和GeoTIFF脚本模块。这里一定要注意GeoTIFF的数据加载方式,要数组的模式。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现…

机器视觉系统选型-环境配置:报错序列不包含任何元素 的解决方法

描述 环境&#xff1a;VM4.0.0VS2015 及以上 现象&#xff1a;配置环境后&#xff0c;获取线线测量模块结果&#xff0c;报错“序列不包含任何元素”。如下图所示&#xff1a; 解答 将“\VisionMaster4.0.0\Development\V4.0.0 \ComControls\bin\x64”下整体重新拷贝。

初识大数据,一文掌握大数据必备知识文集(12)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

大模型加速库flash-attention的安装教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

CSS基础笔记-02动画

CSS基础笔记系列 《CSS基础笔记-01CSS概述》 什么是动画 动画是一种综合艺术&#xff0c;它集合了绘画、电影、数字媒体、摄影、音乐、文学等多种艺术门类于一身。具体来说&#xff0c;动画是通过在连续多格的胶片上拍摄一系列单个画面&#xff0c;然后连续播放&#xff0c;…

七牛云cdn图片加载错误:net::ERR_HTTP2_PROTOCOL_ERROR与HTTP2 检测工具

一、问题描述 今天运营的小伙伴提了个问题&#xff0c;她在后台上传图片的时候有时会遇到上传成功了&#xff0c;但实际回显图片却是一张“破图”&#xff1a; 二、原因调查 先了解一下ERR_HTTP2_PROTOCOL_ERROR是什么意思&#xff1a; ERR_HTTP2_PROTOCOL_ERROR是由HTTP/2协…

【AI视野·今日NLP 自然语言处理论文速览 第六十八期】Tue, 2 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 2 Jan 2024 Totally 48 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers A Computational Framework for Behavioral Assessment of LLM Therapists Authors Yu Ying Chiu, Ashish Shar…