我正在尝试构建一个内存子分配器。我对代码有些错误,它告诉我:
free_list_ptr->next = &firstByte;
free_list_ptr->prev = &firstByte;
我收到了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;
}
答案 0 :(得分:4)
这很可能是错误的:
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"
改为
typedef struct header header; // forward declaration of both
struct header {
int signiture;
int size;
header* next;
header* prev;
};
在C struct header
中,typedef
ed header
位于两个不同的名称空间中。你转发声明的struct header
但你从未定义它。
此外,以_
开头的标识符通常是为内部保留的,因此您不应将它们用于自己的内容。
答案 1 :(得分:1)
更改
free_list_ptr->prev = &firstByte;
到
free_list_ptr->prev = firstByte;
答案 2 :(得分:0)
&firstByte
是header**
。 free_list_ptr->prev
是header*
。
您可以通过以下方式修复您的问题(您当然可以解除警告)
free_list_ptr->prev = firstByte;
free_list_ptr->next = firstByte;
答案 3 :(得分:0)
这应该是
free_list_ptr->prev = firstByte;
free_list_ptr->next = firstByte;
由于next和prev已经是标题指针,因此为它们分配另一个标题指针(firstByte)的地址将导致错误。