diff --git a/06_dynamic/main.c b/06_dynamic/main.c index eaf8b70..11fd53d 100644 --- a/06_dynamic/main.c +++ b/06_dynamic/main.c @@ -58,6 +58,8 @@ int main() printf("\nNach Entfernen:\n"); printNames(); + clearArchive(); + return EXIT_SUCCESS; } diff --git a/06_dynamic/namesarchive.c b/06_dynamic/namesarchive.c index 918fffb..619c5e8 100644 --- a/06_dynamic/namesarchive.c +++ b/06_dynamic/namesarchive.c @@ -3,7 +3,7 @@ #include #include "namesarchive.h" -static char names[MAX_NAMES][MAX_NAME_LEN]; +static char *names[MAX_NAMES]; static unsigned int numberOfNames = 0; static int findNameIdx(const char *name); @@ -14,15 +14,18 @@ static int compareNames(const void *arg1, const void *arg2); // Ist der angegebene Name länger als die zulässige Namenslänge, wird der Name abgeschnitten hinzugefügt. Rückgabe ist dann 1. int addName(const char *name) { - if(numberOfNames < MAX_NAMES) + if(name != NULL && numberOfNames < MAX_NAMES) { - strncpy(names[numberOfNames], name, MAX_NAME_LEN); - names[numberOfNames][MAX_NAME_LEN-1] = '\0'; - numberOfNames++; - return 1; + names[numberOfNames] = malloc(sizeof(*name) * (strlen(name) + 1)); + + if(names[numberOfNames] != NULL) + { + strncpy(names[numberOfNames], name, strlen(name)+1); + numberOfNames++; + return 1; + } } - else - return 0; + return 0; } // Wie addName. Fügt Namen aber direkt sortiert hinzu. Voraussetzung ist ein bereits sortiertes Archiv. @@ -59,20 +62,20 @@ int findNameIdx(const char *name) void removeNameByIdx(unsigned int idx) { + free(names[idx]); for(unsigned i = idx+1; i < numberOfNames; i++) { - strncpy(names[i-1], names[i], MAX_NAME_LEN); - names[i-1][MAX_NAME_LEN-1] = '\0'; + names[i-1] = names[i]; } numberOfNames--; } int compareNames(const void *arg1, const void *arg2) { - const char (*name1)[MAX_NAME_LEN] = arg1; - const char (*name2)[MAX_NAME_LEN] = arg2; + const char *name1 = *((const char **)arg1); + const char *name2 = *((const char **)arg2); - return strcmp(*name1, *name2); + return strcmp(name1, name2); } // Sortiert die Namen im Archiv aufsteigend. @@ -88,4 +91,13 @@ void printNames() { printf("%s\n", names[i]); } +} + +void clearArchive() +{ + for(int i = 0; i < numberOfNames; i++) + { + free(names[i]); + } + numberOfNames = 0; } \ No newline at end of file diff --git a/06_dynamic/namesarchive.h b/06_dynamic/namesarchive.h index 93b4542..fc1036b 100644 --- a/06_dynamic/namesarchive.h +++ b/06_dynamic/namesarchive.h @@ -1,9 +1,6 @@ #ifndef NAMEARCHIVE_H #define NAMEARCHIVE_H -// Maximale Namenslänge -#define MAX_NAME_LEN 10 - // Maximale Anzahl an Namen #define MAX_NAMES 100 @@ -19,4 +16,7 @@ void sortNames(); // Gibt die Namen zeilenweise aus. void printNames(); +// Gibt Resourcen frei +void clearArchive(); + #endif \ No newline at end of file