ฉันมีโครงสร้างข้อมูลที่ซ้อนกันเช่นนี้ (นี่คือการเริ่มต้น):
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;
}
โครงสร้างข้อมูลมีโครงสร้างอย่างไร: ตัวชี้โครงสร้างช่วงหลายช่วงจะถูกจัดเก็บไว้ในอาร์เรย์ 'ช่วง' ของโครงสร้างสัญญาณแต่ละรายการ ตัวชี้โครงสร้างสัญญาณแต่ละตัวจะถูกเก็บไว้ในอาร์เรย์ 'สัญญาณ' ของโครงสร้างสแต็ก (จะมีเพียงตัวเดียวเสมอ)
-> [Signal 0] -> [Interval 0][Interval 1][Interval 2]...
[Stack] -> [Signal 1] -> [Interval 0][Interval 1]
-> [Signal 2] -> [Interval 0][Interval 1][Interval 2]...
วิธีที่ฉันพยายามเข้าถึงและเพิ่มข้อมูลให้ว่าง: ฉันมีสองฟังก์ชันที่พิมพ์ข้อมูลจากภายในโครงสร้าง และพยายามเพิ่มหน่วยความจำที่จัดสรรโดยใช้ malloc (และ realloc) อย่างไรก็ตาม ดูเหมือนว่าฉันจะได้รับ SIGABRT (ข้อผิดพลาด 134) ฉันคิดว่านี่เป็นเพราะว่าฉันเพิ่มหน่วยความจำได้อย่างไร แต่ฉันไม่รู้จะทำยังไง!
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 ถูกเรียกหนึ่งครั้ง และในทางกลับกันจะเรียกฟังก์ชัน pop สำหรับแต่ละสัญญาณ
2. ฟังก์ชัน pop จะพิมพ์โครงสร้างช่วงเวลาแต่ละช่วงซ้ำๆ จนกว่าอาร์เรย์ที่มีช่วงเวลาจะว่างเปล่า ณ จุดนี้ฉันพยายามปล่อยอาร์เรย์ช่วงเวลาออกจากสัญญาณ
3. ณ จุดนี้ป๊อปอัปเสร็จสิ้น และโฟลว์จะกลับไปที่ printIntervals ที่นี่ ฉันพยายามปล่อยอาเรย์สัญญาณให้ว่างเนื่องจากไม่มีอะไรเหลือให้พิมพ์ และวงวนจะเคลื่อนไปเพื่อพิมพ์สัญญาณถัดไปจากสแต็ก
วิธีเพิ่มหน่วยความจำไม่ถูกต้องหรือไม่ ฉันจะแก้ไขข้อผิดพลาดของหน่วยความจำได้อย่างไร ขอบคุณ
static Stack st;
ตามด้วยst.signals = malloc()
แย่มาก และทำให้หน่วยความจำรั่วได้ง่าย โปรดเตรียมและทำความเข้าใจความหมายของstatic
ในบริบทที่คุณใช้ ดูเหมือนว่าคุณต้องการหลีกเลี่ยงmalloc()
ing และด้วยเหตุนี้คุณจึงทำสิ่งที่ผิดอย่างมาก - person Iharob Al Asimi   schedule 14.02.2018