[英]C Array of Linked List Struct on Heap
typedef struct cache_line {
char valid;
mem_addr_t tag;
struct cache_line* next;
} cache_line_t;
typedef cache_line_t* cache_set_t;
typedef cache_set_t* cache_t;
/* The cache we are simulating */
cache_t cache;
void initCache()
{
cache = malloc (S * sizeof(cache_set_t));
for (int i = 0; i < S; i ++ ){
cache[i]= malloc(sizeof(cache_line_t));
cache_line_t *temp = *(cache+i);
temp -> valid = 0;
temp -> tag = 0;
cache_line_t* curr = *(cache+ i );
for (int j = 1; j < E; j++){
curr.next = malloc(sizeof(cache_line_t));
curr = curr.next;
curr.valid=0;
curr.tag=0;
}
curr.next = NULL;
}
}
所以我的脑袋在游动,试图记住指针和结构的所有细节,我已经有一段时间试图完成这个项目。 我在这里试图做的是在堆上分配一个这个结构的数组(一个链表),我一直遇到类型不匹配和诸如此类的问题(对不起,如果它很混乱,我继续尝试新事物并重新编译)。 任何有关我出错的地方的帮助将不胜感激。
好吧,代码被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]
,在每次迭代时它都成为新分配节点内的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.