Я работаю над приложением, которое работает с 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.
Кто-нибудь может понять, почему это происходит? Я считаю, что правильно распределяю память, но, похоже, это источник моей ошибки.
Используйте отладчик и пост результат .Как код размещен, кажется, не имеют любая проблема . – ameyCU
Если 'NUM_STATES' является' # define', почему бы не упростить свою жизнь и просто иметь 'double transition_mat [NUM_STATES] [NUM_STATES];' в структуре? – unwind
Проверьте результаты вызовов функций, когда это имеет значение для вас. Возвращаемое значение 'malloc()' * всегда * имеет значение для вас. Это ошибка «NULL» при ошибке, и если это проскальзывает незамеченным, то впоследствии разыменование, которое вызывает неопределенное поведение (вероятно, segfault). Это вряд ли будет вашей проблемой здесь, если 'NUM_STATES' очень большой, но вы не знаете. –