strings in Array werden überschrieben



  • Hallo,
    folgendes Problem plagt mich seit Stunden

    Ich will aus einer Textdatei die einzelnen zeilen in ein Array speichern.
    Hier erstmal die Funktion:

    char** 
    fillOperationList (FILE * script, int lines)
    {
      int i = 0;
      char cmdLine[256];
      char** res = calloc(lines,256*(sizeof(char)));
      while (fgets(cmdLine,256,script) != NULL)
      {
        if(cmdLine[0] != '#')
        {
          /* test: ausgabe der zeile */
          fprintf(stderr,"cmdline: %s\n",cmdLine);
          res[i] = cmdLine;
          ++i;
        }  
    
      }
    
      for(i = 0;i 
      return res;
    

    lines wurden vorher gezählt, datei wurde ordnungsgemäß geöffnet. Hab ich alles getestet.

    Problem:
    bei einer Textdatei mit dem Inhalt
    AAA
    BBB
    CCC

    ist die Ausgabe:
    cmdline: AAA
    cmdline: BBB
    cmdline: CCC
    CCC
    CCC
    CCC

    aus irgendwelchen Gründen steht am Ende im gesamten Array nur die letzte Zeile.

    hoffe jmd kann mir helfen.



  • hoppla

    for schleife:

    for (i = 0;i < lines;++i)
      {
        fprintf(stderr,"%s\n",res[i]); 
      }  
      return res;
    


  • Durch res[i] = cmdLine; kopierst du nicht den Inhalt von cmdLine.
    res[i] verweist auf cmdLine.

    Und da steht am Ende des Einlesens die letzte Zeile drin.

    Beim verlassen von fillOperationList ist der Speicherplatz von cmdLine allerdings ungültig, da es eine lokale Variable ist.

    Du brauchst ein Array mit Zeigern auf char und dann noch für jede gelesene Zeile Speicherplatz. Diesen kannst du dann allerdings in der Größe der aktuellen Zeile anpassen.

    char** res = calloc(lines,sizeof(char*));
    ....
      res[i] = calloc(lines,strlen(cmdLine)+1);
      strcpy(res[i],cmdLine);
    

    ⚠ Fehlerbehandlung und free() am Ende nicht vergessen.



  • wow danke hat funktioniert!

    ich versteh zwar noch nicht genau warum dass nur so geht, aber ich werds mir nochmal genau anschauen.



  • grindar schrieb:

    ...ich versteh zwar noch nicht genau warum dass nur so geht, aber ich werds mir nochmal genau anschauen.

    Vielleicht hilft es, wenn du das %s pei den printf in %p änderst (beim einlesen und ausgeben). Das gibt dir die Adresse (in Hexdarstellung aus).


Anmelden zum Antworten