【问题标题】:C structs and typedefsC 结构和类型定义
【发布时间】:2019-11-14 02:50:57
【问题描述】:

我不确定为什么这不起作用。我对typedef的有点困惑

typedef struct cache_line {
    int valid;
    int tag;
    int usage;
} cache_line_t;

typedef cache_line_t* cache_set_t;

typedef cache_set_t* cache_t;

void init() {
  S = 2 << (s-1);
  B = 2 << (b-1);

  cache = malloc(sizeof(cache_set_t*) * S);
  for(int i = 0; i < S; i++) {
    cache[i] = malloc(sizeof(cache_line_t*) * E);
    for(int j = 0; j < E; j++) {
      cache[i][j]->valid = 0;
      cache[i][j]->tag = 0;
      cache[i][j]->usage = 0;
    }
  }
}

编译时-&gt;'s 出现错误

s、b、S、B 和 E 是整数。 cache 在上面定义为 cache_t。我正在尝试制作一组​​S 集合,它们是E 行的数组。

非常感谢任何帮助

【问题讨论】:

  • 改掉使用typedef作为指针的习惯,它只会让事情变得更加混乱。
  • cache的声明在哪里?
  • 只是cache_t cache;
  • 请参阅Is it a good idea to typedef pointers? — TL;DR 一般不会,但指向函数的指针除外。请注意,全局变量 sbSBE 可能不应该是全局变量;它们可以与指向(指向)缓存行数据的指针一起存储在一个结构中。您可以将sb 值传递给init() 函数(应命名为cache_init())。全局变量cache 可能是个坏主意;为什么不从init() 返回值。然后你可以拥有不同大小的不同缓存等。

标签: c struct typedef


【解决方案1】:

cache = malloc(sizeof(cache_set_t*) * S); 更改为cache = malloc(sizeof *cache * S);,因为您需要空间来存放cache 指向的S 对象,而不是cache 类型的S 对象。

出于同样的原因,将cache[i] = malloc(sizeof(cache_line_t*) * E); 更改为cache[i] = malloc(sizeof *cache[i] * E);

变化:

  cache[i][j]->valid = 0;
  cache[i][j]->tag = 0;
  cache[i][j]->usage = 0;

到:

  cache[i][j].valid = 0;
  cache[i][j].tag = 0;
  cache[i][j].usage = 0;

因为cache[i][j] 是一个结构,而不是一个指向结构的指针。

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多