当前位置: 首页 > 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.rkmt.cn/news/8897.html

相关文章:

  • 2025.6第一套六级听力生词
  • CSP-S 2025游记
  • atof() - 字符串转double类型
  • 深入解析:解密llama.cpp:从Prompt到Response的完整技术流程剖析
  • 详细介绍:深圳比斯特|电池组PACK自动化生产线厂家概述
  • 密码学学习记录(三)
  • 知行合一
  • 深入解析:解锁AI智能体:上下文工程如何成为架构落地的“魔法钥匙”
  • 小狼毫雾凇拼音安装部署
  • Linux 内核VRF
  • 使用FFmpeg转换m4a
  • 提升多屏监控体验/新增辅屏预览功能/轻松实现跨屏实时监控/支持高达500路多个屏幕同时显示
  • [Java SE/文件系统/IO] 核心源码精讲:java.io.File
  • 【ROS2】 忽略局域网多机通信导致数据接收的bug - 教程
  • 在Ubuntu18.04安装兼容JDK 8的Eclipse集成开发环境
  • 重新理解12306:它卖的从来不是“库存”,而是“状态”
  • 基于Python+Vue开发的房产销售管理系统源码+运行步骤
  • WinSCP从Windows传文件到Linux,文件名为中文显示乱码
  • Oracle中case when函数和decode函数
  • Jmeter生成随机数
  • 实用指南:【Linux篇章】再续传输层协议UDP :从低可靠到极速传输的协议重生之路,揭秘无连接通信的二次进化密码!
  • 第四章:大模型(LLM)】08.Agent 教程-(7)使用 LangGraph 的作文评分架构
  • 详细介绍:您必须知道的 10 大 Highcharts 性能优化技巧—— 提升加载速度与交互体验的实战建议
  • PHP8.5 Pipeline Operator 你应该了解的 8 个特性
  • Nvidia Orin DK 本地 ollama 主流 20GB 级模型 gpt-oss, gemma3, qwen3 部署与测试 - 实践
  • 实用指南:C语言基础【20】:指针7
  • WebSockets与Socket.io渗透测试实战指南
  • 深入解析:spring boot3.0整合rabbitmq3.13
  • mcp-server-chart chart mcp 服务
  • 元推理:人和事物,都是针对性的存在着与必然因果,残缺之美