C programming Circular list for memory suballocator
-
27-06-2021 - |
Pregunta
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;
}
Solución
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 typedef
ed 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.
Otros consejos
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.