0

私はライブラリ用の単純な関数を書いています。それは、他の関数によって管理されるメモリのサイズをパラメータとして取り入れます。

私は、ユーザーによって初期化されたこの大きなメモリプールの情報を保持するデータ構造を持っています。

typedef struct memBlock{
    struct memBlock* next;
    unsigned int size;  // Size of this block
    unsigned int is_used;  // bool 0 = not used 1 = used
}  memBlock;

このデータ構造を初期化する方法と、最初に管理するのに十分なスペースを割り当てる方法を理解しようとしているこの関数もありますか?

int initialize_memory(unsigned long size){

    memBlock *ptr; // the beginning of our whole memory to be handled

    ptr = malloc(size); // this is the ptr to the original memory first allocated.
    ptr->next = NULL;
    ptr->size = NULL;
    ptr->is_used = 0;

    has_initialized = 1; // the memory has been initialized
}

助けてください

4

2 に答える 2

1

に変更ptr->size = NULL;ptr->size = size;ます。また、返却ptrするか、どこかに保管する必要があります。関数はを返しますがint、何も返しません。has_initialized不要なようです-メモリプール(ptr返される値)がNULL. それ以上のヘルプが必要な場合は、さらに説明する必要があります。

補遺: memBlock.size が割り当てられたスペースのサイズか、memBlock によって表されるメモリ ブロックのサイズかを決定する必要があります。後者の場合は、memblock 自体が占めるスペースを減算して考慮する必要があります。それはあなたが割り当てたスペースの量から離れています:ptr->size = size - sizeof(struct memBlock);メモリプールをアドレス指定する方法も必要です...これはmemBlockの直後に続くため、そのアドレスは(ptr + 1)or&ptr[1]です(それがわからない場合は、「Cのポインター演算」を調べてください)。

PSあなたはコメントに書いた「基本的に、「malloc」のように動作してバイト数を予約する別の関数もありますが、最初にこのデータ構造をチェックして、プールからメモリが利用可能かどうかを確認します」

なぜそれをしたいのですか?malloc は、スキルレベルと投資された時間を考慮して、関数よりもはるかに優れたメモリ管理を既に行っており、その上に別のメモリアロケータを重ねても意味がありません。これがメモリ アロケータを作成するための学校のプロジェクトでない限り、その場合は前もってそれを言う必要があります。

于 2011-03-07T20:43:46.430 に答える
0
typedef struct memBlock {
   unsigned int size;
   unsigned int initialized;
   void* block;
} memBlock;

memBlock* new_memBlock(unsigned int size)
{
    memBlock* memblock;

    memblock = malloc(sizeof(memBlock));

    if (memblock)
    {
        memblock->size = size;
        memblock->block = malloc(size);

        if (memblock->block)
            memblock->initialized = 1;
    }

    return memblock;
}

void free_memBlock(memBlock** memblock)
{
    if (*memblock)
    {
        free(*memblock->block)
        *memblock->block = 0;
    }

    free(*memblock);
    *memblock = 0;
}

void main()
{
    memBlock* memblock = new_memBlock(1024);

    if (memblock && memblock->initialized)
        printf("Initialized\n");
    else
        printf("Not initialized\n");

    free_memBlock(&memblock);
}
于 2011-03-07T20:52:34.453 に答える