2016-02-28 34 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变化的类型。