Πρόγραμμα: broken.c (25 μονάδες)
Το πρόγραμμα broken.c δεν λειτουργεί για κάποιον λόγο - όταν το τρέχουμε κρασάρει. Βρείτε όποιο σφάλμα υπάρχει και διορθώστε το χωρίς να εισάγετε καινούρια σφάλματα στο πρόγραμμα. Παράδειγμα επιτυχούς εκτέλεσης ακολουθεί:
$ gcc -o broken broken.c
$ ./broken
yesss! -> yee -> bruh -> NULL
listdelete: 1
yesss! -> yee -> NULL
Το πρόγραμμα:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node {
char value[128];
struct node * next;
} Elem;
int listdelete(char value[], Elem ** head) {
Elem * tmp;
while (*head && strcmp((*head)->value, value)) {
head = &((*head)->next);
}
if (*head) {
tmp=*head;
*head = tmp->next;
free(tmp);
return 1;
}
return -1;
}
int listadd(char value[], Elem ** head) {
Elem * new = malloc(sizeof(Elem));
if (new == NULL) {
return 0;
}
Elem * tmp;
tmp=*head;
*head=new;
new->next=tmp;
strncpy(new->value, value, 127);
return 1;
}
void listprint(Elem * list) {
while(list) {
printf("%s -> ", list->value);
list = list->next;
}
printf("NULL\n");
}
int main() {
Elem elem1 = {"bruh", NULL};
Elem * head = &elem1;
listadd("yee", &head);
listadd("yesss!", &head);
listprint(head);
printf("listdelete: %d\n", listdelete("bruh", &head));
listprint(head);
return 0;
}
Εκτελέστε το με valgrind ή gcc -fsanitize=address και δείτε σε ποια γραμμή σκάει. Αναρωτηθείτε για κάθε κόμβο της λίστας πού ζει στη μνήμη (στοίβα ή σωρός) και ποιοι κόμβοι επιτρέπεται να δοθούν στην free. Η διόρθωση πρέπει να κρατήσει τη λίστα συνεπή και να μην αφήνει διαρροές.
Αριθμός στον οδηγό: Α13.10
(στο κεφάλαιο) ·
Μόνιμο αναγνωριστικό: exam-2023-fall-ex1-q4 ·
Σύνδεσμος: https://progintro.github.io/study/questions/exams/exam-2023-fall-ex1-q4.html ·
Markdown (GitHub)