我到处都有语法错误,对ADT和内存处理的语法理解不当。我需要一个在next
和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;
}
答案 0 :(得分:5)
创建时不能引用typedef
,所以你应该这样做:
typedef struct a_header {
int signiture;
int size;
struct a_header* next;
struct a_header* prev;
} header;
header* the_header;
避免带有前导下划线的名称 - 它们是为系统事物保留的。
答案 1 :(得分:0)
请试试这个:
typedef struct _header *lpheader;
typedef struct _header {
int signiture;
int size;
lpheader next;
lpheader prev;
} header, *lpheader;
为什么这个结构需要32个字节的空间?您应该使用sizeof(_header)
。
答案 2 :(得分:0)
这是你目前的问题。
memory = (byte*) malloc(size);
header firstHead = malloc(sizeof(header));
free_list_ptr = firstHead = memory;
您分配size
并将其位置byte*
存储到memory
。
然后您(正确)分配一个header
结构,并将该空间的分配存储到firstHead
。
然后通过将firstHead
设置为memory
的错误大小的分配空间,然后将free_list_ptr
设置为相同的错误大小的分配空间,将其丢弃(泄漏该内存)。 / p>
由于您当前的指针没有足够的内存,因此当您尝试使用next
和prev
的偏移时会遇到麻烦。
我怀疑你需要这个:
memory = null;
header firstHead = malloc(sizeof(header));
memory = free_list_ptr = firstHead;
这会将指针memory
和free_list_ptr
设置为指向firstHead
所指向的已分配空间。
我不知道您为何使用两个不同的指针来跟踪memory
和free_list_ptr
。我的直觉是其中一个可能足以满足你的目的。
答案 3 :(得分: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
的回报。