c - 内存分配 结构数组结构数组

标签 c pointers malloc dynamic-memory-allocation

我正在尝试用 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

这也行,现在我为集合中的 block 数组分配内存

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 个元素的 block 结构数组。

希望大家能帮帮我!

最佳答案

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

cache = malloc(sizeof(cache));

应该是

cache = malloc(sizeof(*cache));

同样。

之后cache->set->blocks[i]的类型是block_t,而不是block_t *,所以这不根本不需要动态分配内存。

关于c - 内存分配 结构数组结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40314139/

相关文章:

c - 如何在 malloc 字符串上使用 fread

计算两个三位数乘积的最高回文数

c - C 编程的嵌套循环

c - 值变成空字符串

c - malloc 给出奇怪的分配内存地址

c - 为什么这段代码只循环了 4 次?

c# - 如何在 C# 项目中使用 C 代码?包装类?

c - 内核3.3.8中process_backlog和softnet_data字段的理解

c - 将指针传递给在 C 中创建(随机大小)填充随机整数的数组的函数

初始化数组指针的正确语法