Pergunta

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;
}
Foi útil?

Solução

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.

Outras dicas

Change

   free_list_ptr->prev = &firstByte;

to

  free_list_ptr->prev = firstByte;

&firstByte is a header**. free_list_ptr->prev is a header*.

You might fix your problem (you'll certainly get rid of the warning) with:

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

This should be

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

Since next and prev are already header pointers, assigning them the address of another header pointer (firstByte) will cause errors.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top