diff --git a/05_dynamischer_speicher/main.c b/05_dynamischer_speicher/main.c index 4d5b2dc..7c1c869 100644 --- a/05_dynamischer_speicher/main.c +++ b/05_dynamischer_speicher/main.c @@ -58,6 +58,11 @@ int main() printf("\nNach Entfernen:\n"); printNames(); + clearArchive(); + printf("\nNach Clear-Aufruf:\n"); + printNames(); + + return EXIT_SUCCESS; } diff --git a/05_dynamischer_speicher/namesarchive.c b/05_dynamischer_speicher/namesarchive.c index 1acb1ff..85b8a72 100644 --- a/05_dynamischer_speicher/namesarchive.c +++ b/05_dynamischer_speicher/namesarchive.c @@ -5,14 +5,17 @@ #define INDEX_NOT_FOUND -1 -static char *names[MAX_NAMES]; +static char **names = NULL; static unsigned int numberOfEntries = 0; int addName(const char *name) { - if(numberOfEntries < MAX_NAMES) + char **oldPtr = names; + names = realloc(names, sizeof(char*)*(numberOfEntries+1)); + + if(names != NULL) { - names[numberOfEntries] = (char *)malloc(strlen(name)+1); + names[numberOfEntries] = malloc((strlen(name)+1) * sizeof(sizeof(char))); if(names[numberOfEntries] != NULL) { @@ -22,6 +25,8 @@ int addName(const char *name) return 1; } } + else + names = oldPtr; return 0; } @@ -52,6 +57,7 @@ static void removeAt(int idx) names[i] = names[i+1]; } numberOfEntries--; + names = realloc(names, numberOfEntries*sizeof(char*)); } int removeName(const char *name) @@ -67,4 +73,16 @@ int removeName(const char *name) removeAt(idx); return 1; } +} + +void clearArchive() +{ + for(int i = 0; i < numberOfEntries; i++) + { + free(names[i]); + names[i] = NULL; + } + free(names); + names = NULL; + numberOfEntries = 0; } \ No newline at end of file diff --git a/05_dynamischer_speicher/namesarchive.h b/05_dynamischer_speicher/namesarchive.h index 93b4542..d0ef5ab 100644 --- a/05_dynamischer_speicher/namesarchive.h +++ b/05_dynamischer_speicher/namesarchive.h @@ -1,12 +1,6 @@ #ifndef NAMEARCHIVE_H #define NAMEARCHIVE_H -// Maximale Namenslänge -#define MAX_NAME_LEN 10 - -// Maximale Anzahl an Namen -#define MAX_NAMES 100 - // Fügt einen Namen hinzu. Im Fehlerfall (Archiv ist voll) soll 0, ansonsten 1 zurückgegeben werden. // 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); @@ -18,5 +12,7 @@ int removeName(const char *name); void sortNames(); // Gibt die Namen zeilenweise aus. void printNames(); +// Leere Archiv +void clearArchive(); #endif \ No newline at end of file