2012-08-17 76 views
0

我在到處語法錯誤,語法的ADT和內存處理的不好理解。我需要在nextprev中引用自身(其他部分)的結構。我做對了嗎?我得到的錯誤...結構自參考

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

回答

5

你不能引用typedef同時創造它,所以你應該做的:

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

header* the_header; 

避免與領先的下劃線的名字 - 他們是爲系統保留的東西。

+0

清晰的+1:打我吧:) – Havelock 2012-08-17 18:06:22

0

請試試這個:

typedef struct _header *lpheader; 

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

而且你爲什麼需要32個字節的空間對於這種結構?你應該使用sizeof(_header)

+1

恐怕第二部分是完全不同的問題... – Havelock 2012-08-17 18:07:54

+0

@Havelock同意,但這將破壞浩劫,除非結構中的每個元素都是8字節。 :P – Abhinav 2012-08-17 18:12:19

0

這是你目前的問題。

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

你分配size及其作爲byte*位置存儲到memory

然後您(正確)分配一個header結構,並將該空間的分配存儲到firstHead中。

然後你把那個程設置firstHeadmemory的錯誤大小的分配空間(泄漏內存),然後設置free_list_ptr相同的錯誤大小分配的空間。

由於當前指針沒有足夠的內存,當您嘗試使用nextprev的偏移量時會出現問題。

我懷疑你需要這樣的:

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

這將指針memoryfree_list_ptr在分配的空間被firstHead設置爲兩個點指向。

我不知道爲什麼你使用兩種不同的指針來跟蹤memoryfree_list_ptr。我的直覺是,其中1個可能足以滿足您的需求。

+0

如果我更改_header的大小分配,它會正常工作? – ryantata 2012-08-17 18:56:42

+0

我已經用我認爲你需要的內容更新了我的帖子。總之,你需要讓'memory'不分配你不會使用的空間,並且將'free_list_ptr'設置爲'firstHead'。 – StarPilot 2012-08-17 19:10:56

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的回報。