2017-04-05 59 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],并且在每次迭代时它都变成新分配节点内的指针。