【问题标题】:Memory allocation Structure with array of structure with array of structure带有结构数组的内存分配结构和结构数组
【发布时间】:2016-10-28 22:40:16
【问题描述】:

我正在尝试使用 C 进行缓存,但在结构的最后一个数组中分配内存时遇到问题

struct block{
 int validBit;
 char *tag;

}    

typedef struct block block_t;

Struct set{
 block_t *blocks;
}

typedef struct set set_t;

Struct cache{
  //Some other variables but not important for this question
  set_t *set;
}

typedef struct cache cache_t;

所以我在 setupCache() 函数中像这样为缓存分配内存

cache_t *cache = NULL;

cache = malloc(sizeof(cache));
if(cache == NULL){
 fprintf(stdout, "Could not allocate memory for cache!");
}

这很好用,现在我分配一个包含 16 个元素的结构集数组的内存

cache->set = malloc(16 * sizeof(cache->set));
//same error check as above here, just left our for precision of question

这也有效,现在我为集合中的块数组分配内存

for(i = 0; i < 16; i++){
cache->set->blocks = malloc(2 * sizeof(cache->set->blocks));

这又可以了,但麻烦来了

cache->set->blocks[i] = malloc(sizeof(block_t));

这给我一个错误:从类型“void *”分配给类型“block_t”时类型不兼容

不太确定我做错了什么,可能是一些愚蠢的事情。

应该是这样的: 缓存包含一个包含 16 个元素的集合结构数组,每个集合元素都应该有一个包含 2 个元素的块结构数组。

希望你们能帮助我!

【问题讨论】:

    标签: c pointers malloc dynamic-memory-allocation


    【解决方案1】:

    首先,在您的代码中,您的内存分配是错误的。您为每个内存分配提供了完全错误的大小。例如,

    cache = malloc(sizeof(cache));
    

    应该是

    cache = malloc(sizeof(*cache));
    

    同样如此。

    之后,cache-&gt;set-&gt;blocks[i] 的类型为 block_t,而不是 block_t *,因此根本不需要动态分配内存。

    【讨论】:

    • 嗨!非常感谢您的回复!不过我有点困惑。你能解释一下为什么我应该用 *cache 而不是缓存来提供大小吗?此外,cache->set->blocks 应该是结构 block_t 的 2 个元素的数组。这些不应该被分配内存吗?
    猜你喜欢
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2021-05-29
    • 2018-09-24
    相关资源
    最近更新 更多