Pointer verändert den gespeicherten wert ...
-
Ich habe folgenden Code und das Problem und zwar, wenn ich als Namenanzahl 5 oder größer Eintrage, wird während der Ausgabe der erster Eingegebende Name Gelöscht. Also auf dem Index Null! Hat da jemand eine Idee?
#include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #define MAXLAENGE 51 int main (void) { char swap[MAXLAENGE]; int NamAnz = 0, index; char dummy[81]; char** PtrNamPtrArr = NULL; printf("\n\n"); printf("Anzahl der Namen: "); scanf("%d", &NamAnz); printf("\n\n"); if (NamAnz < 1) NamAnz = 1; else if (NamAnz > 10) NamAnz = 10; gets(dummy); PtrNamPtrArr = (char **) calloc (NamAnz, sizeof(char)); for (index = 0; index < NamAnz; index++) { printf("Name %2d: ", index + 1); fgets(swap, MAXLAENGE, stdin); swap[strlen(swap) - 1] = '\0'; PtrNamPtrArr[index] =(char*) malloc (strlen(swap) + 1); strcpy(PtrNamPtrArr[index], swap); printf("Name %d: %s\n", index + 1, PtrNamPtrArr[index]); printf("Name %d: %s\n", index + 1, PtrNamPtrArr[0]); } for (index = 0; index < NamAnz; index++) printf("Name %d: %s\n", index + 1, PtrNamPtrArr[index]); gets(dummy); free(PtrNamPtrArr); return 0; }
Danke schon mal!
Xeox
-
Danke habe fehler gefunden!!
-
der tim hat hier eine faq über malloc begonnen. das scheint irgendwie festgefahren.
also, den rückgabewert von malloc sollte man nicht casten. sowas:
PtrNamPtrArr = (char **) calloc (NamAnz, sizeof(char)); PtrNamPtrArr[index] =(char*) malloc (strlen(swap) + 1);
ist also pfui !
besser ohne cast:
PtrNamPtrArr = calloc (NamAnz, sizeof(char)); PtrNamPtrArr[index] = malloc (strlen(swap) + 1);
für jedes malloc ein free. du gibst nur einmal das zeigerarray frei.
in deinem fall wäre also noch zu ergänzen:for (index = 0; index < NamAnz; index++) free(PtrNamPtrArr[index]); // speicherplatz für die namen freigeben
und danach erst
free(PtrNamPtrArr); // speicherplatz fürs zeigerarray freigeben
desweiteren forderst du fürs zeigerarray die größe sizeof(char) an:
PtrNamPtrArr = (char **) calloc (NamAnz, sizeof(char));speichern möchtest du aber zeiger auf char, und die haben die größe sizeof(char*).
calloc zu verwenden ist nicht sehr sinnvoll, weil im nächsten durchgang die werte sowieso wieder mit den adressen für die speicherbereiche der namen überschrieben werden.nicht nötig:
swap[strlen(swap) - 1] = '\0';
weil fgets terminiert.weiterhin gutes gelingen
mfg m.a.
-
memory allocator schrieb:
der tim hat hier eine faq über malloc begonnen. das scheint irgendwie festgefahren.
Jo, Haupt auf meine Asche