我正在开发一个处理贝叶斯网络的应用程序,在C中。我有以下结构来表示模型,它基本上只是一个转换矩阵和一个状态列表。
typedef struct {
char **states; /* Array of state names */
double **transition_mat; /* Transition matrix */
} model_t;
但是,当我尝试使用模型的转换矩阵时,我会遇到分段错误。我正在实例化一个模型如下:
model_t *model = malloc(sizeof(model_t));
model->transition_mat = malloc(NUM_STATES * sizeof(double *));
for (int i = 0; i < NUM_STATES; i++) {
model->transition_mat[i] = malloc(NUM_STATES * sizeof(double));
}
(这里,NUM_STATES
只是模型所具有的状态数)。使用NUM_STATES = 8
我已经初始化了一个模型,然后我尝试以下方法:
model->transition_mat[6][2] = 0.121;
导致前面提到的分段错误。
有人知道为什么会这样吗?我相信我正确分配内存,但这似乎是我错误的来源。
答案 0 :(得分:0)
什么阻止你做这样的事情(因为你似乎还有NUM_STATES作为#define。
typedef struct {
char states[NUM_STATES]
double transition_mat[NUM_STATES][NUM_STATES]
} model_t;
另外,请始终检查malloc()是否返回NULL。因为这意味着内存分配失败。如果你的程序滑倒,然后你试图使用一个你无法分配内存的东西,你基本上要求获得段错误。
答案 1 :(得分:0)
我不确定您的问题是否与您发布的代码有关,因为以下内容适用于我的系统中的gcc 4.8:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char **states;
double **transition_mat;
} model_t;
int main()
{
int NUM_STATES=8;
int i;
model_t *model = malloc(sizeof(model_t));
model->transition_mat = malloc(NUM_STATES * sizeof(double *));
for (i = 0; i < NUM_STATES; i++) {
model->transition_mat[i] = malloc(NUM_STATES * sizeof(double));
}
model->transition_mat[6][2] = 0.121;
printf("transition_mat[6][2] = %g\n", model->transition_mat[6][2]);
return 0;
}
您是否检查了对malloc的调用的返回值?
您可以尝试删除指针,看看是否有类似问题,这可能有助于缩小问题范围:
model_t model;
model.transition_mat = malloc(NUM_STATES * sizeof(double *));
for (i = 0; i < NUM_STATES; i++) {
model.transition_mat[i] = malloc(NUM_STATES * sizeof(double));
}
model.transition_mat[6][2] = 0.121;