為啥VEX沒有malloc啊~~~
問:當(dāng)沒有malloc的情況下粒竖,應(yīng)該怎么辦
答:沒有槍壤追,沒有炮,自己給自己造~~~
經(jīng)過上次的實(shí)踐款票,我們已知要做出和原版malloc相似的功能至少需要三樣?xùn)|西杂抽。
- 一塊可以訪問的內(nèi)存塊
- 表示數(shù)據(jù)在內(nèi)存中位置的值(指針)
- 訪問數(shù)據(jù)的方法
在上個版本的內(nèi)存管理中自点,第一個要素是一個由MemoryUnit 組成的數(shù)組遂赠,第二個要素為一個int值久妆,來保存取得的MemoryUnit位置。因?yàn)榈诙€要素不是原生的指針跷睦,所以需要額外的Get和Set函數(shù)來作為第三要素筷弦。
那么如果把第二要素改為原生的指針,就不需要額外的讀取和保存方法送讲。在使用高級的數(shù)據(jù)結(jié)構(gòu)時也不需要另外修改結(jié)構(gòu)奸笤。
什么是指針
變量二要素
1.儲存空間
2.讀取方法
基本上看過C的人都對指針有一定了解。指針是一個值哼鬓。一個指向?qū)?yīng)內(nèi)存地址的值监右。指針雖然有不同的類型,像int指針异希,char指針健盒,結(jié)構(gòu)體指針,但是指針讀取方法是不變的称簿。唯一不同的是指針指向的空間大小是變化的扣癣。
實(shí)驗(yàn)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
從上述實(shí)驗(yàn)可以看出char指針可以轉(zhuǎn)換為int并且可以正常使用。這證實(shí)了一件事情憨降,不同類型的指針是可以相互轉(zhuǎn)換的父虑,只要空間大小匹配使用是沒有問題的。
那根據(jù)以上的描述和原裝的函數(shù)定義char* malloc(int size)
可以腦補(bǔ)出大致的結(jié)構(gòu)授药。
動態(tài)內(nèi)存管理實(shí)現(xiàn)
那就上代碼吧
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;
}
}
}
}
可以看出士嚎,與上次的架構(gòu)相比,這次的可以使用c原裝的指針來訪問相應(yīng)的位置悔叽。在使用高級的數(shù)據(jù)結(jié)構(gòu)時也更加方便莱衩。