当前位置: 首页 > news >正文

准备工作之动态内存分配[基于郝斌课程]

定义一块内存可以用数组定义,也可以动态分配:

使用数组定义一块内存,则该块内存是静态的,也就是一旦定义之后,这块内存的大小就固定了,例如,数组元素个数是5,则定义后,这=这块内存大小就是5,不能再改变

但是用malloc动态分配的话,这块内存的大小就由我们自己来定义了,例如定义大小为5的内存块,使用完毕后,需要一个大小为3的内存块,就可以先使用malloc来定义一个大小为3的内存块,如何使用free来释放此块内存,之后再次使用malloc来定义大小为3的内存块,最后需要用free来释放该块内存

/* @file main.c @brief 数据结构预备知识之动态内存分配 @author EricsT (EricsT@163.com) @version v1.0.0 @date 2025-09-20 @history 2025-09-20 EricsT - 新建文件 */ #include <stdio.h> #include <malloc.h> int main(void) { int a[5] = { 4, 10, 2, 8, 6 }; int len; printf("请输入您需要分配的数组长度:len = "); scanf("%d", &len); //malloc函数只返回首字节地址 int* ptr = (int*)malloc(sizeof(int) * len);//分配内存 *ptr = 4;//类似于a[0] = 4 *(ptr + 1) = 10;//类似于a[1] = 10; ptr[2] = 2;//类似于a[2] = 2; printf("%d %d %d\n\n\n", ptr[0], ptr[1], ptr[2]); for (int i = 0; i < len; ++i) scanf("%d", ptr + i); for (int i = 0; i < len; ++i) printf("%d\n", ptr[i]); free(ptr);//释放内存 return 0; }

在以下程序中,调用了 f() 函数时, j 所占内存是存在的,当 f() 函数调用结束后, j 所占的内存就不合法了,因为 j 是一个局部变量

/* @file main.c @brief 数据结构预备知识之动态内存分配 @author EricsT (EricsT@163.com) @version v1.0.0 @date 2025-09-20 @history 2025-09-20 EricsT - 新建文件 */ #include <stdio.h> int f(); int main(void) { int i = 10; i = f(); printf("i = %d\n", i); return 0; } int f() { int j = 20; return j; }

在以下程序中,掉用函数结束后,ptr都可以指向合法的内存块

/* @file main.c @brief 数据结构预备知识之跨函数使用内存 @author EricsT (EricsT@163.com) @version v1.0.0 @date 2025-09-20 @history 2025-09-20 EricsT - 新建文件 */ #include<stdio.h> #include <malloc.h> void fun(int** p); int main(void) { int* p; fun(&p); //调用完之后,p就指向合法的内存块 return 0; } void fun(int** p) { *p = (int*)malloc(4);//手动分配,不释放就会一直被占用 }
/* @file main.c @brief 数据结构预备知识之跨函数使用内存 @author EricsT (EricsT@163.com) @version v1.0.0 @date 2025-09-20 @history 2025-09-20 EricsT - 新建文件 */ #include <stdio.h> #include <malloc.h> struct Student { int sid; int age; }; Student* CreatStudent(void); void ShowStudent(Student* ptrStu); int main(void) { Student* ptrStu;//占4个字节 //Student std;//占8个字节,所以采用指针操作 ptrStu = CreatStudent(); ptrStu->age = 10; ptrStu->sid = 99; ShowStudent(ptrStu); return 0; } Student* CreatStudent(void) { return (Student*)malloc(sizeof(Student)); } void ShowStudent(Student* ptrStu) { printf("%d %d\n", ptrStu->age, ptrStu->sid);
http://www.cnnetsun.cn/news/1637904.html

相关文章:

  • JavaScript 对象
  • MbsAgent 4.0景区游客服务热线解决方案
  • 机械手控制系统核心组成与实操操作详解
  • 3步高效配置Magic Trackpad三指拖拽:Windows 11无缝体验指南
  • CogPMAlignMultiTool 工具 脚本实写硬币及载具案例
  • GPT-SoVITS语音克隆技术全解析:从原理到实践的完整指南
  • 等保.三级要求下Redis 安全测评应该怎么做?
  • 【Java结构化并发终极指南】:20年专家亲授3大优化范式与5个避坑红线
  • VS Code 代码 AI 补全冲突排查与解决指南(AI总结版)
  • 阿里人在Github分享的Spring Cloud全栈笔记,你想象不到有多全
  • 若依管理系统实战:基于Vuex的用户角色权限与动态菜单路由解析
  • c++编程:多组数据求和
  • AIAgent产业化加速落地,国泰计算机ETF(512720)逆势走强
  • 规则执行器设计与实现:优化复杂条件判断
  • 用AI重新定义中文字体设计:从3000个字符到完整字库的智能飞跃
  • 4 文件系统概述
  • Web自动化测试:selenium(环境部署和元素定位)
  • 别再用time.sleep模拟流式了!FastAPI 2.0原生async generator流式实践(含LangChain集成、RAG流式分块、错误恢复兜底机制)
  • 如何构建专业领域的大语言模型:中医AI诊疗系统的技术实现方案
  • seo优化机构怎样选择才合适_什么是seo优化机构
  • 3分钟搞定Windows软件安装难题:winget-install终极解决方案
  • FNET嵌入式TCP/IP协议栈:轻量、双栈、无OS的工业级网络方案
  • 嵌入式轻量级三自由度逆运动学库Leg
  • Qwen3.5-9B多场景应用:短视频脚本生成+分镜图描述+配音文案一体化
  • 个人知识库构建:OpenClaw+千问3.5-27B自动整理碎片化笔记
  • M5Battery嵌入式电池电量可视化库详解
  • SDMatte镜像CI/CD流程:GitHub Actions自动构建+镜像扫描+部署验证
  • 从比赛冠军到开源项目:手把手教你复刻我那台26秒跑完的STM32F103循迹小车
  • 【deepseek讲解】咖啡小白进阶指南:从豆子到杯子,手冲咖啡的避坑实战手册
  • 嵌入式技术社区运营与内容创作实践