2015-10-05 67 views
0

我正在處理一個處理貝葉斯網絡的應用程序,我使用下面的結構來表示一個模型,它基本上只是一個轉換矩陣和一個列表狀態。當處理結構中嵌入的矩陣時出現分段錯誤

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

使用您發佈似乎並不有一個調試器和後的結果。至於代碼任何問題 。 – ameyCU

+2

如果'NUM_STATES'是'#define',爲什麼不簡化您的生活,並且在結構中只有'double transition_mat [NUM_STATES] [NUM_STATES];' – unwind

+0

檢查你的函數調用的結果,當它對你很重要時。 'malloc()'*的返回值總是對你很重要。當出現錯誤時它是'NULL',並且如果由於不被注意而滑落,那麼隨後的解引用會產生未定義的行爲(可能是段錯誤)。除非'NUM_STATES'非常大,但你不知道,這不太可能是你的問題。 –

回答

0

什麼是從做這樣的事情(如你似乎有NUM_STATES作爲的#define反正阻止你。

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

同時,始終。檢查的malloc()返回NULL,因爲這意味着內存分配失敗。如果你的程序滑倒了,然後你試圖使用一個你不能分配內存給你的東西,基本上要求得到一個段錯誤。

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;