2015-10-05 2 views
0

Я работаю над приложением, которое работает с Bayes Networks, на 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; 

, что приводит к вышеупомянутому Сегментация Fault.

Кто-нибудь может понять, почему это происходит? Я считаю, что правильно распределяю память, но, похоже, это источник моей ошибки.

+0

Используйте отладчик и пост результат .Как код размещен, кажется, не имеют любая проблема . – ameyCU

+2

Если 'NUM_STATES' является' # define', почему бы не упростить свою жизнь и просто иметь 'double transition_mat [NUM_STATES] [NUM_STATES];' в структуре? – unwind

+0

Проверьте результаты вызовов функций, когда это имеет значение для вас. Возвращаемое значение 'malloc()' * всегда * имеет значение для вас. Это ошибка «NULL» при ошибке, и если это проскальзывает незамеченным, то впоследствии разыменование, которое вызывает неопределенное поведение (вероятно, segfault). Это вряд ли будет вашей проблемой здесь, если 'NUM_STATES' очень большой, но вы не знаете. –

ответ

0

Что мешает вам делать что-то вроде этого (как вы, кажется, NUM_STATES как #define в любом случае.

typedef struct { 
char states[NUM_STATES] 
double transition_mat[NUM_STATES][NUM_STATES] 
} model_t; 

Кроме того, всегда проверяйте, если таНос() возвращает NULL. Поскольку это означает, что ошибка выделения памяти Если это проскальзывает ваша программа, и затем вы пытаетесь использовать вещь, которую вы не могли выделить для вас, вы просите, чтобы получить segfault.

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; 
Смежные вопросы