以下代码给出了一个seg错误。 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;
}
如果您想查看struct typedefs:
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;
答案 0 :(得分:2)
应该是:
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
(你缺少的)分配空间实际结构(因为你有一个指针的二维数组,而不是结构的二维数组)。
此外,don't cast the result of malloc
。在循环条件下,使用您计算的n
的值,而不是再次计算它。
我认为只为结构体创建一个名称然后在名称后添加*
以使其成为指针会更简单,而不是让memo_s
成为实际的结构体memo_t
。 1}}是指向该结构的指针。我发现在解决这个问题时确实很困惑。
答案 1 :(得分:1)
除了你的(部分)错误的数组分配,问题是你没有分配实际的结构。 memo[j][k]
是一个指针,但你不能指向任何地方,所以当你取消引用时,你有undefined behavior。