为啥VEX没有malloc啊~~~
问:当没有malloc的情况下,应该怎么办
答:没有枪,没有炮,自己给自己造~~~
经过上次的实践,我们已知要做出和原版malloc相似的功能至少需要三样东西。
- 一块可以访问的内存块
- 表示数据在内存中位置的值(指针)
- 访问数据的方法
在上个版本的内存管理中,第一个要素是一个由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<MEMORY_SIZE; i++) {
heap[i] = 0;
info[i] = 0;
}
coreState.memorySize = MEMORY_SIZE;
coreState.state = 1;
coreState.freeMemoryCount = MEMORY_SIZE;
}
int* malloc(int size) {
for (int i = 0; i<MEMORY_SIZE; i++) {
int notEnoughSpacce = 0;
if (info[i] == 0) {
if ((i + size)<MEMORY_SIZE) {
for (int j = 0; j<size; j++) {
if (info[j + i] != 0)
notEnoughSpacce = 1;
}
if (notEnoughSpacce == 0) {
for (int j = 0; j<size; j++) {
info[j + i] = 1;
}
return &(heap[i]);
}
}
}
}
return &null;
}
void free(int* pointer, int size) {
for (int i = 0; i<MEMORY_SIZE; i++) {
if (&(heap[i]) == pointer) {
for (int j = 0; j<size; j++) {
heap[i + i] = null;
info[j + i] = 0;
}
}
}
}
可以看出,与上次的架构相比,这次的可以使用c原装的指针来访问相应的位置。在使用高级的数据结构时也更加方便。