【发布时间】:2015-03-19 20:19:41
【问题描述】:
下面的代码给了我一个段错误。 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;
【问题讨论】:
-
首先,don't cast the result of
mallocin C。然后,您在两个调用中混合了sizeof运算符的类型。第一个调用分配一个 pointers 数组,第二个调用分配一个 values 数组。或者更确切地说,第一次调用应该使用指向结构的双指针,或指向memo_t的指针作为sizeof运算符的操作数。
标签: c memoization