如何在没有Malloc的情况下动态管理内存 V2.0

为啥VEX没有malloc啊~~~

问:当没有malloc的情况下,应该怎么办
答:没有枪,没有炮,自己给自己造~~~

经过上次的实践,我们已知要做出和原版malloc相似的功能至少需要三样东西。

  1. 一块可以访问的内存块
  2. 表示数据在内存中位置的值(指针)
  3. 访问数据的方法

在上个版本的内存管理中,第一个要素是一个由MemoryUnit 组成的数组,第二个要素为一个int值,来保存取得的MemoryUnit位置。因为第二个要素不是原生的指针,所以需要额外的Get和Set函数来作为第三要素。
那么如果把第二要素改为原生的指针,就不需要额外的读取和保存方法。在使用高级的数据结构时也不需要另外修改结构。

什么是指针

变量二要素
1.储存空间
2.读取方法

基本上看过C的人都对指针有一定了解。指针是一个值。一个指向对应内存地址的值。指针虽然有不同的类型,像int指针,char指针,结构体指针,但是指针读取方法是不变的。唯一不同的是指针指向的空间大小是变化的。
实验1

void main(){
    char memory[10];
    int* num=(int*)memory;
    int* num2=(int*)&(memory[4]);
    printf("num: %p\n",num);
    printf("num2: %p\n",num2);
}
output:
    num: 0079FB44
    num2: 0079FB49

从上述实验可以看出char指针可以转换为int并且可以正常使用。这证实了一件事情,不同类型的指针是可以相互转换的,只要空间大小匹配使用是没有问题的。
那根据以上的描述和原装的函数定义char* malloc(int size)可以脑补出大致的结构。

动态内存管理实现

那就上代码吧

void init() {
    for (int i = 0; i
int* malloc(int size) {
    for (int i = 0; i
void free(int* pointer, int size) {
    for (int i = 0; i

可以看出,与上次的架构相比,这次的可以使用c原装的指针来访问相应的位置。在使用高级的数据结构时也更加方便。

你可能感兴趣的:(如何在没有Malloc的情况下动态管理内存 V2.0)