初始化特定结构的大数组——出现段错误
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
是指向该结构的指针。我在尝试解决这个问题时发现它真的很混乱。
下面的代码给我一个段错误。 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
是指向该结构的指针。我在尝试解决这个问题时发现它真的很混乱。