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では、2つの異なる名前空間に住んでいます。あなたは前方宣言し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

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.

于 2012-08-18T17:51:16.137 に答える