处理嵌入在struct中的矩阵时的分段错误

时间:2015-10-05 11:15:23

标签: c multidimensional-array struct segmentation-fault

我正在开发一个处理贝叶斯网络的应用程序,在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;

导致前面提到的分段错误。

有人知道为什么会这样吗?我相信我正确分配内存,但这似乎是我错误的来源。

2 个答案:

答案 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;