我有結構,我爲它分配內存:錯誤的分配大小或錯誤的自由方法的使用?
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;
}
我確定你想分配'sizeof(TRANSITION)',因爲現在你只需要爲指針分配足夠的空間,而不是實際上指向的是什麼。我希望你能保存'realloc'的價值,不要試圖釋放原來的東西。很難說,因爲你沒有顯示實際的代碼。 –
@AlexD我以前有過,但一切都搞砸了。我的字符看起來像這樣。顯然有些內存錯誤 – Goldi
當你使用'realloc'時,你的指針可能指向一個新的地方,你也可能會收到一個返回值'NULL' - 你確定你釋放了正確的指針(不是舊地址)嗎?此外,您在代碼中沒有執行**任何**錯誤處理,您忽略了可能的意外情況,並且顯然忽略了編譯器警告......使用編譯器警告,它們可以幫助您! – Myst