C语言实例_实现malloc与free函数完成内存管理

2023年 8月 13日 68.2k 0

一、malloc和free函数介绍

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

image-20230627232221413

(1)malloc函数

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

原型如下:

void* malloc(size_t size);
  • size参数表示要分配的内存块的大小,以字节为单位。
  • 函数返回一个指向分配内存块的指针,如果分配失败,则返回NULL

使用场景:

  • 动态分配内存,例如在程序运行时根据需要创建数据结构。
  • 为字符串、数组、结构体等动态分配内存空间。

使用方法:

#include 
#include 
​
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;
}

(2)free函数

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

原型如下:

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

使用场景:

  • 释放通过malloccallocrealloc等函数动态分配的内存。
  • 避免内存泄漏,即释放不再使用的内存,以便其他代码可以使用该内存。

使用方法:

#include 
#include 
​
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
#include

#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

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论