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 😞


Anmelden zum Antworten