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

malloc与free函数完成内存管理

一、malloc和free函数介绍

在C语言中,mallocfree是用于动态内存管理的函数。

二、malloc函数

malloc函数用于在堆(heap)中分配指定大小的内存空间,并返回一个指向该内存块的指针。

void* malloc(size_t size);
  • size参数表示要分配的内存块的大小,以字节为单位。

  • 函数返回一个指向分配内存块的指针,如果分配失败,则返回NULL

使用场景:

  • 动态分配内存,例如在程序运行时根据需要创建数据结构。

  • 为字符串、数组、结构体等动态分配内存空间。

include <stdio.h>
#include <stdlib.h>int main() {int* ptr;int num = 5;ptr = (int*)malloc(num * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}for (int i = 0; i < num; i++) {ptr[i] = i + 1;}for (int i = 0; i < num; i++) {printf("%d ", ptr[i]);}free(ptr);return 0;
}

三、free函数

free函数用于释放之前通过malloccalloc函数动态分配的内存空间。

void free(void* ptr);
  • ptr参数是一个指向先前分配的内存块的指针。如果ptrNULL,则free函数不执行任何操作。

使用场景:

  • 释放通过malloccallocrealloc等函数动态分配的内存。

  • 避免内存泄漏,即释放不再使用的内存,以便其他代码可以使用该内存。

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr = (int*)malloc(5 * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 使用动态分配的内存// 释放内存free(ptr);return 0;
}

一旦调用了free函数,就应该避免继续使用已释放的内存,已释放的内存将不再属于程序的有效内存区域,并且可能被其他部分重用。在释放内存后继续使用已释放的内存会导致未定义的行为和潜在的错误。

四、实现自己的malloc和free函数

定义一个数组 unsigned char buff[1024*100]; 然后使用C语言代码写个my_malloc和my_free函数,对这个buff数组的空间进行管理。 用户调用my_malloc和my_free函数管理这段空间。

include <stdio.h>
#include <stdlib.h>#define BUFF_SIZE (1024 * 100)unsigned char buff[BUFF_SIZE];typedef struct {unsigned char* start;size_t size;
} MemoryBlock;MemoryBlock memoryBlocks[BUFF_SIZE] = {0};
int numBlocks = 0;void* my_malloc(size_t size) {// 寻找空闲块for (int i = 0; i < numBlocks; i++) {if (memoryBlocks[i].size == 0 && size <= BUFF_SIZE) {memoryBlocks[i].start = buff;memoryBlocks[i].size = size;return memoryBlocks[i].start;}}// 分配新的块if (numBlocks < BUFF_SIZE) {memoryBlocks[numBlocks].start = buff + numBlocks;memoryBlocks[numBlocks].size = size;numBlocks++;return memoryBlocks[numBlocks - 1].start;}// 分配失败return NULL;
}void my_free(void* ptr) {// 查找要释放的块for (int i = 0; i < numBlocks; i++) {if (memoryBlocks[i].start == ptr) {memoryBlocks[i].size = 0;break;}}
}int main() {// 使用my_malloc和my_free进行内存管理unsigned char* ptr1 = (unsigned char*)my_malloc(10);unsigned char* ptr2 = (unsigned char*)my_malloc(20);if (ptr1 != NULL && ptr2 != NULL) {// 使用分配的内存for (int i = 0; i < 10; i++) {ptr1[i] = i;}for (int i = 0; i < 20; i++) {ptr2[i] = i + 10;}printf("ptr1: ");for (int i = 0; i < 10; i++) {printf("%d ", ptr1[i]);}printf("\n");printf("ptr2: ");for (int i = 0; i < 20; i++) {printf("%d ", ptr2[i]);}printf("\n");}my_free(ptr1);my_free(ptr2);return 0;
}
  • buff数组是用于存储分配的内存块的总空间。

  • MemoryBlock结构体用于记录每个内存块的起始位置和大小。

  • my_malloc函数用于分配指定大小的内存块,在memoryBlocks数组中找到一个空闲块或分配一个新块,并返回其起始地址。

  • my_free函数用于释放先前分配的内存块,在memoryBlocks数组中查找要释放的块,并将其大小设置为0。

  • main函数中,通过调用my_malloc来分配内存块,并通过调用my_free来释放内存块。

http://www.dtcms.com/a/500929.html

相关文章:

  • 网站建设书籍在线阅读阿里云代理网站怎么做
  • 建设二手商品网站总结wordpress 关闭多站点
  • 网站模版建设工具dede网站搬家 空间转移的方法
  • 互联网科技公司做网站哪家好网站动态模板
  • 心理网站建设策划书网站加载页模板
  • 网站建设项目体会定制西服
  • 企业手机端网站模板常州外贸网站制作
  • 高校网站模板最近的电脑培训班在哪里
  • P1040题解
  • 【LLM】字节的DAPO强化学习算法
  • wordpress 上传文件名关键词优化排名软件哪家好
  • lovefort表白网站制作wordpress导航栏调用
  • 郑州网站建设全媒体运营师培训费用
  • 深圳方维网站设计公司seo网站建设视频
  • 有网站的源代码如何做网站如何上传自己的做的网站
  • 身份认证技术对比:Session、JWT、Token、SSO、OAuth 2.0
  • 温州网站建设 首选国鼎网络好昆山网站建设义搏
  • 青岛慧思网站建设wordpress主题防止破解
  • 【小白笔记】普通二叉树(General Binary Tree)和二叉搜索树的最近公共祖先(LCA)
  • 画出网站和目录结构图电子商务就业岗位有哪些
  • 网站开发的有关公司如何设计小程序
  • 架构建模技术深度解析:SysML与AADL的全方位对比
  • 1920的网站做字体大小车行网站源码
  • 网站建设 接单什么网站做简历免费
  • 网页打不开但是qq能上是怎么回事aso推广优化
  • 汽车设计网站wordpress网页不存在
  • 做的网站很卡是什么原因宁波网站建设费用是多少钱
  • 淘客返利网站怎么做揭阳网站制作软件
  • MCAL故障注入点的作用解析
  • RTX5060Ti安装双系统ubuntu22.04各种踩坑点(黑屏,引导区修复、装驱动、server版本安装)