0

我到处都有语法错误,对 ADT 和内存处理的语法理解不好。next我需要一个在and中引用自身(其他部分)的结构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

你不能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

这是您当前的问题。

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

您将其位置分配size并存储为byte*into memory

然后你(正确地)分配一个header结构,并将该空间的分配存储到firstHead.

firstHead然后通过设置为 的大小错误的分配空间来丢弃它(泄漏内存)memory,然后设置free_list_ptr为相同大小的分配空间。

由于您当前的指针没有足够的内存,因此当您尝试使用nextand的偏移量时会遇到麻烦prev

我怀疑你需要这个:

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

这将设置指针memoryfree_list_ptr指向 指向的分配空间firstHead

我不知道您为什么使用两个不同的指针来跟踪memoryfree_list_ptr. 我的直觉是,其中 1 个可能足以满足您的目的。

于 2012-08-17T18:13:26.837 回答
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 回答