2016-02-28 33 views
0

我有結構,我爲它分配內存:錯誤的分配大小或錯誤的自由方法的使用?

TRANSITION *transitions = malloc(sizeof(TRANSITION *)); 

我在程序的其他部分添加轉場效果,所以我的realloc內存:

TRANSITION *transitions = source->transitions; 
transitions = realloc(transitions, (numberTransitions + 1) * sizeof(TRANSITION *)); 

而且我有希望的方法釋放內存:

free(transitions); 

當我撥打免費方式獲得:

"Aborted (core dumped)" 

有什麼不對?

整個代碼:

#include <stdio.h> 
#include <stdbool.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct STATE STATE; 
typedef struct TRANSITION TRANSITION; 

struct STATE 
{ 
    char name[4]; 
    bool initial_state; 
    bool final_state; 
    TRANSITION *transitions; 
    int numberTransitions; 
}; 

struct TRANSITION 
{ 
    char c; 
    STATE *destination; 
}; 

STATE *create_state(char *name, bool is_initial, bool is_final); 
void add_transition(STATE *source, char sign, STATE *dest); 
void destroy_state(STATE **pp_state); 

int main(void) 
{ 
    STATE *state0 = create_state("S'0", true, false); 
STATE *state1 = create_state("S'1", false, false); 
STATE *state2 = create_state("S'2", false, true); 
STATE *zero_state = create_state("0", false, false); 

add_transition(state0, 'a', state1); 
add_transition(state0, 'b', zero_state); 

add_transition(zero_state, 'a', zero_state); 
add_transition(zero_state, 'b', zero_state); 

add_transition(state1, 'a', state1); 
add_transition(state1, 'b', state2); 

add_transition(state2, 'a', state1); 
add_transition(state2, 'b', state2); 
destroy_state(&state0); 
} 

STATE *create_state(char *name, bool is_initial, bool is_final) 
{ 
    STATE *state = malloc(sizeof(STATE *)); 
    strcpy(state->name, name); 
    state->initial_state = is_initial; 
    state->final_state = is_final; 
    state->transitions = NULL; 
    state->numberTransitions = 0; 
    return state; 
} 

void add_transition(STATE *source, char sign, STATE *dest) 
{ 
    if (source->transitions == NULL) 
    { 

     TRANSITION *transitions = malloc(sizeof(TRANSITION *)); 
     transitions->c = sign; 
     transitions->destination = malloc(sizeof(STATE *)); 
     transitions->destination = dest; 
     source->transitions = transitions; 
     source->numberTransitions = 1; 
    } 
    else 
    { 
     TRANSITION *transitions = source->transitions; 
     int numberTransitions = source->numberTransitions; 
     transitions = realloc(transitions, (numberTransitions + 1) * sizeof(TRANSITION *)); 
     transitions[numberTransitions].c = sign; 
     transitions[numberTransitions].destination = dest; 
     (source->numberTransitions)++; 
    } 
} 

void destroy_state(STATE **pp_state) 
{ 
    TRANSITION *transitions = (*pp_state)->transitions; 
    // free(transitions->destination); 
    // transitions->destination = NULL; 
    free(transitions); 
    // transitions = NULL; 
    // free(pp_state); 
    // pp_state = NULL; 

} 
+1

我確定你想分配'sizeof(TRANSITION)',因爲現在你只需要爲指針分配足夠的空間,而不是實際上指向的是什麼。我希望你能保存'realloc'的價值,不要試圖釋放原來的東西。很難說,因爲你沒有顯示實際的代碼。 –

+0

@AlexD我以前有過,但一切都搞砸了。我的字符看起來像這樣。顯然有些內存錯誤 – Goldi

+0

當你使用'realloc'時,你的指針可能指向一個新的地方,你也可能會收到一個返回值'NULL' - 你確定你釋放了正確的指針(不是舊地址)嗎?此外,您在代碼中沒有執行**任何**錯誤處理,您忽略了可能的意外情況,並且顯然忽略了編譯器警告......使用編譯器警告,它們可以幫助您! – Myst

回答

1

修復您的分配後,您需要在source中存儲返回值realloc。您還需要檢查分配是否成功。

當前您將舊指針保留在source中,因此當您嘗試釋放內存時,該塊已被釋放,並且實際分配的內存因爲未存儲在任何位置而被泄漏。

+0

這解決了我的問題。謝謝 – Goldi

3

我想你想的malloc的sizeof(過渡),而不是的sizeof(過渡*)。首先是分配TRANSITION結構的大小,第二個是mallocs,指針的大小可能小於結構大小。

2

我寧願援引malloc這樣的:

T *t = malloc(sizeof(*t)); 

這樣,你的分配始終是對象指針所指向的大小。

當然這是相當於到:

T *t = malloc(sizeof(T)); 

,但在事件避免了錯誤,的t變化的類型。