0

どこにでも構文エラーがあり、ADT の構文とメモリ処理の理解が不十分です。nextandでそれ自体 (他のセクション) を参照する構造体が必要ですprev。私はそれを正しくやっていますか?エラーが出ます...

struct _header * header;

typedef struct _header {
    int signiture;
    int size;
    header_t* next;
    header_t* prev;
} header;

また、メモリ内の最初の 32 バイトをヘッダーで初期化したい (これもうまくいきません..):

//this is to reference the memory block later
static int *free_list_ptr;

void function(u_int32_t size){
    memory = (byte*) malloc(size);
    header firstHead = malloc(sizeof(_header));
   free_list_ptr = firstHead = memory;
   firstHead->prev = free_list_ptr;
   firstHead->next = free_list_ptr;
}
4

4 に答える 4

5

作成中にa を参照することはできないtypedefため、次のようにする必要があります。

typedef struct a_header {
    int signiture;
    int size;
    struct a_header* next;
    struct a_header* prev;
} header;

header* the_header;

先頭にアンダースコアが付いている名前は避けてください。これらはシステム用に予約されています。

于 2012-08-17T18:05:04.013 に答える
0

これを試してください:

typedef struct _header *lpheader;

typedef struct _header {
    int signiture;
    int size;
    lpheader next;
    lpheader prev;
} header, *lpheader;

また、なぜこの構造に32バイト相当のスペースが必要なのですか?むしろを使用する必要がありますsizeof(_header)

于 2012-08-17T18:07:06.427 に答える
0

あなたは複雑すぎると考えています、あなたtypedefは遅すぎます、そしてあなたはの宣言の中で間違った名前を使用していますstruct

typedef struct header header; // <- forward declare "struct header" and identifier "header"

struct header {
    int signiture;
    int size;
    header* next;
    header* prev;
};

続編については、あなたが何をしたいのかよくわかりませんでした。宣言されていない奇妙な名前を使用し、のリターンをキャストすることは確かですmalloc

于 2012-08-17T18:25:04.507 に答える
0

これがあなたの現在の問題です。

memory = (byte*) malloc(size); 
header firstHead = malloc(sizeof(header)); 
    free_list_ptr = firstHead = memory; 

その場所を として に割り当てsizeて保存しbyte*ますmemory

次に、(正しく) 1 つのheader構造体を割り当て、そのスペースの割り当てを に格納しfirstHeadます。

firstHead次に、間違ったサイズの割り当てられたスペースに設定することでそれを捨てます(そのメモリをリークします) 。次に、同じ間違ったサイズの割り当てられたスペースにmemory設定します。free_list_ptr

next現在のポインタが十分なメモリを保持していないため、とのオフセットを使用しようとすると問題が発生しますprev

これが必要だと思います:

memory = null; 
header firstHead = malloc(sizeof(header)); 
memory = free_list_ptr = firstHead; 

これにより、ポインターmemoryfree_list_ptrの両方が、 が指す割り当てられたスペースを指すように設定されfirstHeadます。

memoryとを追跡するために 2 つの異なるポインターを使用している理由がわかりませんfree_list_ptr。私の直感では、これらのうちの 1 つでおそらく目的には十分であると思います。

于 2012-08-17T18:13:26.837 に答える