2017-04-05 52 views
-3

printf(「pointer =%p \ n」,line);C堆上的鏈接列表結構數組

塊引用

塊引用

+3

用typedefing指針怎麼這麼酷......真的嗎? –

+0

@SouravGhosh - 收入保障。它使得代碼非常糟糕,以至於沒有人能夠站在調試它的地方,而只是自己。 – StoryTeller

+0

我不知道大聲笑,骨架代碼是這樣的,我覺得它真的很奇怪 – genericmathstudent

回答

2

好了,其實代碼非常具有typedef濫用混淆可能走很長的路向兩個你和編譯器的問題。我自己不會在這個程序中有一個typedef。它在這裏沒有真正的抽象。下面是我建議(錯誤檢查的一些遺漏):

struct cache_line { 
    char valid; 
    mem_addr_t tag; 
    struct cache_line* next; 
}; 

struct cache_line** cache; 

void initCache() 
{ 
    cache = malloc (sizeof(*cache) * S); 
    for (int i = 0; i < S; i ++){ 
     struct cache_line** curr_p = &cache[i]; 
     for (int j = 1; j < E; j++){ 
      *curr_p = malloc(sizeof(**curr_p)); 
      (*curr_p)->valid = 0; 
      (*curr_p)->tag = 0; 
      (*curr_p)->next = NULL; 
      curr_p = &(*curr_p)->next; 
     } 
    } 
} 

重點要注意的事情:

  1. 我刪除了所有的類型定義。他們在這裏沒有真正的目的,而是嘗試保存打字。他們是以代碼質量爲代價的。我也將其從struct中刪除,因爲我相信前面的說法也適用於它。

  2. 我分配了規範的內存。通過編寫malloc(sizeof(*pointer_variable)),無論pointer_variable指向什麼,都可以分配足夠的內存。它有點類型不可知論者。

  3. 我用「鏈接遍歷」成語遍歷鏈表。我不跟蹤「節點」,而是跟蹤指向節點的指針。在開始時它是cache[i],並且在每次迭代時它都變成新分配節點內的指針。