printf(“pointer =%p \ n”,line);
块引用
块引用
答案 0 :(得分: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;
}
}
}
需要注意的关键事项:
我删除了所有的typedef。它们在这里没有任何实际意义,但试图保存打字。他们是以代码质量为代价的。我也从struct
中删除了它,因为我相信之前的声明也适用于它。
我按规范分配内存。通过编写malloc(sizeof(*pointer_variable))
,无论pointer_variable
指向什么,都可以分配足够的内存。它有些类型不可知。
我使用“链接遍历”习惯来遍历链表。我没有跟踪“节点”,而是跟踪指向节点的指针。在开头它是cache[i]
,并且在每次迭代时它都成为新分配节点内的指针。