Search code examples
cmemory-managementlinked-listcircular-list

C programming Circular list for memory suballocator


Am trying to build a memory suballocator. I've some errors with the code bellow, it tells me that:

free_list_ptr->next = &firstByte;
free_list_ptr->prev = &firstByte;

am getting gcc error warnings of warning: assignment from incompatible pointer type

//primitive variable of byte as char, always positive.
typedef unsigned char byte;
static byte *memory = NULL;

struct header;

typedef struct _header {
    int signiture;
    int size;
    struct header* next;
    struct header* prev;
} header;


static header *free_list_ptr;


void allocator_init(u_int32_t size){

    memory = (byte*) malloc(size);

    //initialize free_list_ptr;
    free_list_ptr = (header*) memory;

        header* firstByte = (header*) memory;

    free_list_ptr->size = size;

    //error here: warning: assignment from incompatible pointer type
    free_list_ptr->prev = &firstByte;
    free_list_ptr->next = &firstByte;
}

Solution

  • This is most probably wrong:

    struct header;               // forward declare "struct header"
    
    typedef struct _header {
        int signiture;
        int size;
        struct header* next;     // refer to the forward declared "struct header"
        struct header* prev;
    } header;                    // declare type-alias "header"
    

    do instead

    typedef struct header header; // forward declaration of both
    
    struct header {
        int signiture;
        int size;
        header* next;
        header* prev;
    };
    

    In C struct header and the typedefed header live in two different name spaces. You forward declared struct header but you never defined it.

    Also, identifiers starting with _ are usually reserved for internals, so you shouldn't use them for your own stuff.