allocってどう作るんだ?
本に書いてあるサンプルプログラムだけでは分からん
ということでサンプルプログラムを以下の様に修正
#include<stdio.h>
#define ALLOCSIZE 1000static char allocbuf[ALLOCSIZE]; //staticで固定長メモリプールを確保static char *allocp = allocbuf;
char *my_alloc(int n){/*現在の空き領域を計算し、指定されたサイズの領域を割り当てることができるかどうかを判定
具体的には、allocbuf + ALLOCSIZE は、メモリプールの先頭アドレスからプールの全体サイズを表しています。これに対して、現在の空き領域の先頭アドレスである allocp を引いたものが、プール内で割り当て可能な残りの領域サイズを表します。
if 文の条件式は、このサイズが指定されたサイズ n 以上である場合に真となり、その場合は領域を割り当てることができます。サイズが不足している場合には、条件式が偽となり、領域を割り当てることができません。
つまり、この条件式はメモリプールに割り当て可能な領域が残っているかどうかをチェックしているわけです。*/printf("allocbuf=%d\n", allocbuf);printf("ALLOCSIZE=%d\n", ALLOCSIZE);printf("allocp=%d\n", allocp);
printf("allocbuf + ALLOCSIZE=%d\n", allocbuf + ALLOCSIZE);printf("allocbuf + ALLOCSIZE - allocp=%d\n", allocbuf + ALLOCSIZE - allocp);
printf("\n");if(allocbuf + ALLOCSIZE - allocp >= n){//n文字の容量があるかチェックallocp += n;return allocp;}else{return NULL;}}
int main(void) {printf("start\n");
char *ap1 = (char *)my_alloc(100);char *ap2 = (char *)my_alloc(100);char *ap3 = (char *)my_alloc(100);
printf("ap1 = %p\n", ap1);printf("ap2 = %p\n", ap2);printf("ap3 = %p\n", ap3);
printf("ap2 - ap1 = %d\n", ap2 - ap1);printf("ap3 - ap1 = %d\n", ap3 - ap1);
return 0;}
結果
start
allocbuf=4227104
ALLOCSIZE=1000
allocp=4227104
allocbuf + ALLOCSIZE=4228104
allocbuf + ALLOCSIZE - allocp=1000allocbuf=4227104
ALLOCSIZE=1000
allocp=4227204
allocbuf + ALLOCSIZE=4228104
allocbuf + ALLOCSIZE - allocp=900allocbuf=4227104
ALLOCSIZE=1000
allocp=4227304
allocbuf + ALLOCSIZE=4228104
allocbuf + ALLOCSIZE - allocp=800ap1 = 00408084
ap2 = 004080E8
ap3 = 0040814C
ap2 - ap1 = 100
ap3 - ap1 = 200
よく本を読んだら簡単だった
if(allocbuf + ALLOCSIZE - allocp >= n)について
allocbufのアドレス=4227104で、
100メモリ確保するときは、
allocpのアドレスを+100して=4227204
allocp - allocbuf = 100
ALLOCSIZE=1000なので、
ALLOCSIZE - (allocp - allocbuf) = 1000 - 100 = 900
残りの容量は900