カニゲーム攻略日記ブログ

beatmaniaIIDXやハースストーンなどのゲーム攻略日記。主にまったり勢。2016年にIIDX皆伝になった

プログラミング言語C(K&R)  第5章 5.4アドレス計算 alloc

allocってどう作るんだ?

本に書いてあるサンプルプログラムだけでは分からん

 

ということでサンプルプログラムを以下の様に修正

 


#include<stdio.h>

#define ALLOCSIZE 1000
static 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=1000

allocbuf=4227104
ALLOCSIZE=1000
allocp=4227204
allocbuf + ALLOCSIZE=4228104
allocbuf + ALLOCSIZE - allocp=900

allocbuf=4227104
ALLOCSIZE=1000
allocp=4227304
allocbuf + ALLOCSIZE=4228104
allocbuf + ALLOCSIZE - allocp=800

ap1 = 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