-1

Я написал простой распределитель памяти, и я столкнулся с проблемой, где я не думаю, что я обращаюсь к элементам памяти, как я думаю :), и я не могу понять ошибку , Два вопроса, которые есть снова с выходной стороны, было бы больше, о чем я не буду знать.Распределитель памяти - проблема при перемещении памяти

Проблемы - 1) в то время как (block-> next! = NULL) сбой при достижении следующего блока 2) В свободном размере memptr-> появляется ноль.

Я не пытался заглянуть в выравнивании памяти или фрагментация аспекта, цель состояла в том, чтобы получить что-то простое работает

#include <stdio.h> 
#include <stdbool.h> 

#define length 10000 

char memory[length] = {0}; 

typedef struct MEMBLOCK 
{ 
    struct MEMBLOCK *next; 
    int size; 
    bool is_available; 
}memblock; 

int remain_memory = length; 

memblock* ptrlastblock; 
memblock* endOfBlock(memblock *block); 
void* allocMemory(memblock *block, int size); 
void* xmalloc(size_t size); 
void myfree(void *ptr); 


int main(void) 
{ 
    int *ptr = (int *)xmalloc(10); 
    if (ptr == NULL) 
    { 
    printf("memory allocation failed \n"); 
    } 
    else 
    { 
    *ptr = 4; 
    } 
// myfree(ptr); 
    int *ptr1 = (int *)xmalloc(10); 
    myfree(ptr1); 

    return 0; 
} 

void* xmalloc(size_t size) 
{ 
    memblock *block = (memblock*) memory; // point to head of memory region 
    return allocMemory(block, size); 
} 

void* allocMemory(memblock *block, int size) 
{ 
    if (remain_memory == length) // if no memory used allocate block 
    { 
    block->next = NULL;    
    block->is_available = false; 
    block->size = size; 
    ptrlastblock = endOfBlock(block); // point it to beginning of next block 
    remain_memory -= size; 
    return (void *)block + 1; // increment block so pointing to begining of memory post block 
    } 

    if(remain_memory > size) 
    { 
     while(block->next != NULL) // keep incrementing till you find 
     {        // last used chunk 
     block = block->next; 
     } 
    block = endOfBlock(block); 
    block->next = NULL; 
    block->size = size; 
    block->is_available = false; 
    remain_memory -= size; 
    return (void *)block + 1; 
    } 
    else 
    { 
    return NULL; 
    } 

} 

memblock* endOfBlock(memblock *block) 
{ 
    memblock* eofblock = (memblock*)((size_t)(block + 1) + (size_t)block->size); 
    return eofblock; 
} 

void myfree(void *ptr) 
{ 
    memblock *memptr = (memblock *)ptr - 1; 
    if (memptr->is_available == false) 
    { 
    memptr->is_available = true; 
    printf(" memory with pointer is %d \n", memptr->size); 
    remain_memory += memptr->size; 
    } 
} 
+0

Что это сумасшедший комментарий стиль? Если я правильно пойму, он будет относиться к вашему «блоку» дважды. Это предназначено? –

+0

@EugeneSh. - Я добавил больше комментариев к коду. Извините, не получил ваш вопрос полностью – oneday

+0

Сразу после 'if (осталось_memory> size)' есть двойной '**', который не является частью комментария. –

ответ

1

Я думаю, что проблема в том, что:

return (void *)block + 1; 

интерпретируется как:

((void *) block) + 1 

поскольку литье имеет более высокий приоритет, чем добавление. Возможно, вы переписываете свою структуру memblock с помощью *ptr = 4;.

[EDIT]

Я думаю, что вы должны делать то, что Евгений уже предложил в комментарии:

return (void *) (block + 1) 
+0

Большое спасибо за ответ. Да, вы правы, и я об этом не знал. Так спасибо за то, что я знаю об этом – oneday