【问题标题】:C Array of Linked List Struct on Heap堆上链表结构的 C 数组
【发布时间】:2017-08-31 03:48:41
【问题描述】:
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;
        }

}

所以我的脑袋在游动,试图记住指针和结构的所有细节,我已经有一段时间试图完成这个项目。我在这里要做的是在堆上分配一个这种结构的数组(一个链表),我一直遇到类型不匹配和诸如此类的问题(对不起,如果它很乱,我会继续尝试新事物并重新编译)。任何关于我哪里出错的帮助将不胜感激。

【问题讨论】:

  • 类型定义指针有什么了不起的……真的吗?
  • @SouravGhosh - 收入保障。它使代码变得如此糟糕,以至于除了自己之外,没有人可以忍受调试它。
  • 我不知道lol,骨架代码是这样来的,我也觉得很奇怪
  • @StoryTeller 我也怀疑对“自己”的有效性...:)
  • @genericmathstudent - 这不仅奇怪,而且有害。为您提供此代码的人认为他们在进行“抽象”,而实际上他们正在执行混淆。

标签: c struct heap-memory


【解决方案1】:

好吧,代码被滥用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],在每次迭代时它都成为新分配节点内的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2013-02-25
    • 2018-04-27
    • 1970-01-01
    • 2018-12-29
    • 2020-09-13
    • 2018-05-14
    相关资源
    最近更新 更多