C编程内存子分配器的循环列表

时间:2012-08-18 17:44:52

标签: c memory-management linked-list circular-list

我正在尝试构建一个内存子分配器。我对代码有些错误,它告诉我:

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

我收到了warning: assignment from incompatible pointer type

的gcc错误警告
//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;
}

4 个答案:

答案 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)

&firstByteheader**free_list_ptr->prevheader*

您可以通过以下方式修复您的问题(您当然可以解除警告)

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)的地址将导致错误。