繁体   English   中英

堆上链表结构的C数组

[英]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;
        }
    }
}

需要注意的关键事项:

  1. 我删除了所有的 typedef。 他们在这里没有真正的目的,只是为了节省打字。 他们以牺牲代码质量为代价。 我也从struct删除了它,因为我相信前面的声明也适用于它。

  2. 我规范地分配了内存。 通过编写malloc(sizeof(*pointer_variable)) ,无论pointer_variable指向什么,您都可以分配足够的内存。 这有点类型不可知论。

  3. 我用“链接遍历”习语遍历链表。 我没有跟踪“节点”,而是跟踪指向节点的指针。 一开始它是cache[i] ,在每次迭代时它都成为新分配节点内的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM