Saya memiliki struktur data bersarang (ini adalah inisialisasinya):
Interval *newInterval(int b, int e, int m){
static Interval i;
i.b = b;
i.e = e;
i.m = m;
return &i;
}
Signal *newSignal(int size){
static Signal s;
s.intervals = malloc(size * sizeof(Interval));
s.top = 0;
s.size = size;
return &s;
}
Stack *newStack(int size){
static Stack st;
st.signals = malloc(size * sizeof(Signal));
st.top = 0;
st.size = size;
return &st;
}
Bagaimana struktur datanya: Beberapa penunjuk struktur Interval disimpan dalam larik 'interval' dari setiap struktur Signal. Setiap penunjuk struct Signal disimpan dalam array 'sinyal' dari struct Stack (hanya akan selalu ada satu).
-> [Signal 0] -> [Interval 0][Interval 1][Interval 2]...
[Stack] -> [Signal 1] -> [Interval 0][Interval 1]
-> [Signal 2] -> [Interval 0][Interval 1][Interval 2]...
Cara saya mencoba mengakses dan membebaskan data: Saya memiliki dua fungsi yang mencetak data dari dalam struktur, dan mencoba mengosongkan memori yang dialokasikan menggunakan malloc (dan realloc). Namun sepertinya saya mendapatkan SIGABRT (kesalahan 134). Saya kira ini karena cara saya membebaskan memori; tapi aku tidak tahu harus berbuat apa!
void pop(Signal *s, int n){
if(n < s->top) {
printf("[%d,%d)@%d ", s->intervals[n].b, s->intervals[n].e, s->intervals[n].m);
pop(s,n+1);
}
else {
free(s->intervals);
}
}
void printIntervals(Stack *st){
for(int i=0; i<st->top; i++){
pop(&(st->signals[i]), 0);
printf("\n");
free(&(st->signals[i]));
}
}
1. printIntervals dipanggil satu kali, dan pada gilirannya memanggil fungsi pop untuk setiap sinyal.
2. Fungsi pop secara rekursif mencetak setiap struct interval, hingga array yang berisi interval kosong, pada saat itulah saya mencoba untuk membebaskan array intervals dari sinyal.
3. Pada titik ini pop selesai, dan aliran kembali ke printIntervals. Di sini, saya mencoba untuk membebaskan array sinyal karena tidak ada lagi yang tersisa untuk dicetak, dan loop bergerak untuk mencetak sinyal berikutnya dari Stack.
Apakah cara saya mengosongkan memori salah? Bagaimana cara memperbaiki kesalahan memori? Terima kasih.
static Stack st;
diikuti olehst.signals = malloc()
sangat buruk, dan memori mudah bocor. Harap bersiap dan memahami artistatic
dalam konteks Anda menggunakannya. Tampaknya Anda ingin menghindarimalloc()
ing dan untuk itu Anda melakukan sesuatu yang sangat salah. - person Iharob Al Asimi   schedule 14.02.2018