初始化特定结构的大数组——出现段错误

Initializing a big array of a certain structure -- getting seg faults

下面的代码给我一个段错误。 gdb 说它来自 memos[j][k] -> cost = -1; 行,但我不能确切地说出哪里出了问题。我在猜测我是如何分配内存的,数组索引被错误地越界了?

memo_array_t mk_empty_memo_array(int l) {

    int n = pow(2, l+2);
    memo_t **memos = (memo_t **) malloc(n*sizeof(struct memo_s));
    for(int i = 0; i < pow(2, l+2); i++) {
        memos[i] = (memo_t *) malloc(n*sizeof(struct memo_s *));
    }
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < pow(2, l+2); k++) {
            memos[j][k] -> cost = -1;
            memos[j][k] -> color = -1;
            memos[j][k] -> split = -1;
            memos[j][k] -> box = NULL; 
            memos[j][k] -> split_value = -1; 
        }
    }

    memo_array_t memo_array = (memo_array_t) malloc(sizeof(struct memo_array_s));
    memo_array -> dim = n;
    memo_array -> memos = memos;

    return memo_array;
}

如果您想查看结构类型定义:

typedef struct memo_s {
  int cost;
  int color;
  int split;
  double split_value;
  box_t box;  
} *memo_t;

typedef struct memo_array_s {
  int dim;
  memo_t **memos;
} *memo_array_t;

除了你对数组的分配(部分)错误之外,问题是你没有分配实际的结构。 memo[j][k] 是一个指针,但你不会让它指向任何地方所以当你取消引用它时你有 undefined behavior.

应该是:

memo_t **memos = malloc(n*sizeof(struct memo_s **));
for(int i = 0; i < n; i++) {                // ^^ two *s here!
    memos[i] = malloc(n*sizeof(struct memo_s *));   

    // And finally, allocate the actual structs:  
    for(int j = 0; j < n; j++) {    
        memos[i][j] = malloc(sizeof(struct memo_s); 
    }
} 

所以第一个 malloc 分配一个指针数组,第二个 malloc 分配一个指针数组,第三个 malloc (你遗漏的)分配 space 用于实际结构(因为你有一个 指针 的二维数组,而不是 结构 的二维数组)。

此外,don't cast the result of malloc。并且在循环条件中,使用你计算的n的值,而不是再次计算它。

我认为结构只有一个名称然后在名称后添加一个 * 使其成为指针会更简单,而不是让 memo_s 成为实际的结构并且memo_t 是指向该结构的指针。我在尝试解决这个问题时发现它真的很混乱。