C 打印错误数据

C 打印错误数据,c,C,所以我试着模拟一个缓存。现在,我为块和集合创建了结构,并创建了它们的构造函数。当激活缓存集的构造函数时,它将所有标记和有效位初始化为0。然而,我一直在为标签打印垃圾数据。我可能设置的指针不正确,但我很难弄清楚是什么 #include <inttypes.h> #include <string.h> #include <stdio.h> #include <stdlib.h> typedef struct { uint64_t tag; unsi

所以我试着模拟一个缓存。现在,我为块和集合创建了结构,并创建了它们的构造函数。当激活缓存集的构造函数时,它将所有标记和有效位初始化为0。然而,我一直在为标签打印垃圾数据。我可能设置的指针不正确,但我很难弄清楚是什么

#include <inttypes.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


typedef struct
{
uint64_t tag;
unsigned int valid_bit;
}block;

typedef struct
{
unsigned int set_bit;
unsigned int number_of_blocks;
block * blocks;
}cache_set;


block *make_A_BLOCK(uint64_t tg, unsigned int v_b)
{
block *b = malloc(sizeof(block));
b->tag = tg;
b->valid_bit = v_b;
return b;
}
void change_tag(block *b,uint64_t t_g){b->tag = t_g;}
void change_bit(block *b,unsigned int v_b){b->valid_bit = v_b;}
uint64_t return_tag(block *b){ return b->tag;}
unsigned int return_bit(block *b){ return b->valid_bit;}


cache_set *make_A_CACHE_SET(unsigned int s_b, unsigned int n_b)
{
int i;
//uint64_t blank = 0;
cache_set *c_s = malloc(sizeof(cache_set));
c_s->set_bit = s_b;
c_s->number_of_blocks = n_b;
block *blocks = malloc(n_b * sizeof(block));


for (i=0; i < n_b; i++)
{
    blocks[i].tag = 0;
    blocks[i].valid_bit = 0;
}
free(blocks);
return c_s;
}
void print_cache_set(cache_set *c_s)
{
int i;
printf("Number of Cache Sets: %d \r\n",c_s->number_of_blocks);
for (i= 0; i < c_s->number_of_blocks ; i++)
{
    printf("Block %d ",i);
    printf(" Block Tag " "%" PRIu64, return_tag(&(c_s->blocks[i])));
    //printf(" Block Bit %d \r\n", blocks[i].valid_bit);
}
}


int main(void)
{
cache_set *test = make_A_CACHE_SET(0,10);
print_cache_set(test);
printf("done");
return 0;
}
#包括
#包括
#包括
#包括
类型定义结构
{
uint64_t标签;
无符号整数有效位;
}块;
类型定义结构
{
无符号整数集\位;
块的无符号整数个数;
区块*区块;
}缓存集;
块*make_A_块(uint64_t tg,无符号整数v_b)
{
block*b=malloc(sizeof(block));
b->tag=tg;
b->有效位=v\u b;
返回b;
}
无效更改标签(块*b,uint64\t\g){b->tag=t\g;}
无效更改位(块*b,无符号整数v_b){b->valid_位=v_b;}
uint64返回标记(块*b){return b->tag;}
无符号整数返回_位(块*b){return b->valid_位;}
缓存集*生成缓存集(无符号整数s\u b,无符号整数n\u b)
{
int i;
//uint64_t blank=0;
cache_set*c_s=malloc(sizeof(cache_set));
c_s->设置_位=s_b;
c\u s->u块的数量=n\u b;
block*blocks=malloc(n_b*sizeof(block));
对于(i=0;iu块的数量);
对于(i=0;iu块的数量;i++)
{
printf(“块%d”,i);
printf(“Block Tag”“%”PRIu64,return_Tag(&(c_-s->blocks[i]));
//printf(“块位%d\r\n”,块[i]。有效位);
}
}
内部主(空)
{
缓存集*测试=使缓存集(0,10);
打印缓存集(测试);
printf(“完成”);
返回0;
}

制作现金集时,分配块并将指向它们的指针指定给局部变量,然后逐个初始化块

但是,不要让
c\s->blocks
指向这个初始化的块列表,而是将它们释放为
free(blocks)


所以我建议用
c\s->blocks=blocks

取代
free(blocks)
,,没错!非常感谢你!