1

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

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

我收到 gcc 错误警告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;
}
4

4 回答 4

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;
};

在 Cstruct headertypedefedheader中,存在两个不同的名称空间。您转发声明struct header但您从未定义它。

此外,以 开头的标识符_通常是为内部保留的,所以你不应该将它们用于你自己的东西。

于 2012-08-18T18:08:27.523 回答
1

改变

   free_list_ptr->prev = &firstByte;

  free_list_ptr->prev = firstByte;
于 2012-08-18T17:48:35.483 回答
0

&firstByte是一个header**free_list_ptr->prev是一个header*

您可以通过以下方式解决您的问题(您肯定会摆脱警告):

free_list_ptr->prev = firstByte;
free_list_ptr->next = firstByte;
于 2012-08-18T17:50:26.813 回答
0

这应该是

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

由于 next 和 prev 已经是头指针,给它们分配另一个头指针(firstByte)的地址会导致错误。

于 2012-08-18T17:51:16.137 回答