Probleme beim Erstellen einer char-Liste

lukasS

Erfahrenes Mitglied
Hallo,

ich möchte eine Funktion haben in der eine char-Liste mit Werten gefüllt wird. Die Liste soll dynamisch sein, also die Größe ist unbekannt. In meinem Testprojekt kann ich die Liste zwar füllen, aber so bald ich aus der Funktion raus bin, ist die wieder genau so wie vor dem Funktionsaufruf. Hier das Beispiel:

Code:
void testFunc(char** ppsz_array)
{
   ppsz_array = (char **) malloc (sizeof (char *));

   for(int i = 0; i < 10; i++)
   {
      if(i > 0)
         ppsz_array = (char **) realloc (ppsz_array, (i + 1) * sizeof (char *));
      ppsz_array[i] = (char *) malloc (100 * sizeof(char));

      //mit Werten füllen
      char sz_buff[10];
      itoa(i + 100, sz_buff, 10);
      strcpy(ppsz_array[i], sz_buff);
   }

   for (int n = 0; n < 10; n++)
     printf ("%s\n", ppsz_array[n]);
   //alles ok
}

int main(int argc, char* argv[])
{

   char* ppsz_array = NULL;

   testFunc(&ppsz_array);

   //ppsz_array ist NULL
   for (int n = 0; n < 10; n++)
     printf ("%s\n", ppsz_array[n]);

   getch();

   free (ppsz_array);

   return 0;
}

In der testFunc funktioniert alles, Daten werden auch richtig ausgegeben, nur leider komme ich irgendwo mit den Pointern durcheinander und somit ist ppsz_array in der main-Funktion leer.

Ich habe das ganze noch mit einer Struktur gemacht, die ppsz_array beinhaltet, damit läuft das einwandfrei. Möchte aber trotzdem wissen, wie ich das ohne Struktur lösen soll.

Wo ist hier der Fehler drin?

Danke im Voraus!

Gruß

Lukas
 
Hi.

Du übergibst der Funktion ja extra einen Zeiger auf eine lokale Variable der main Funktion.

Jetzt müßtest du diese Variable natürlich auch manipulieren, d.h. du mußt in der Funktion die ppsz_array Variable an jeder Stelle dereferenzieren. Du veränderst nur den Parameter den du bekommen hast und überschreibst gleich am Anfang die Adresse der Variable aus main mit einer neu allozierten Adresse. So hast du dann keine Chance.

Gruß

PS: Unter einer Liste verstehe ich übrigens kein Array welches ständig neu alloziert wird wenn es erweitert werden muss. Außerdem müßtest du noch irgendwo speichern wie groß das Array ist, denn momentan hast du zwar ein dyn. Array, aber die Größe legst du ja doch nur beim Kompilieren fest.

PPS: Ich sehe gerade das du eigentlich ein Array von Strings verwenden willst. Dann mußt du in dem Array auch Strings speichern, momentan kannst du in deinem Array nur einzelne char speichern:
C:
testFunct(char*** ppsz_array);

char** ppsz_array = NULL;

testFunc(&ppsz_array);
 
Zuletzt bearbeitet:
Hallo deepthroat,

danke für die schnelle Antwort. Das ist nur ein Beispiel-Projekt. Im eigentlichen Projekt kenne ich die Array-Größe nicht, da ich dort einem Iterator arbeite, der mir keine Array-Größe ausgibt. Deshalb muss ich mit einem dyn. Array arbeiten.
Das mit dem Parameter verändern macht Sinn. Leider habe ich keine große C++-Erfahrung, kannst du mir bitte ein kleines Beispiel zeigen?

Danke!

Lukas
 
C:
testFunct(char*** ppsz_array);

char** ppsz_array = NULL;

testFunc(&ppsz_array);

Ja, das mit dem 3-Fachen-Pointer hatte ich schon sogar, kam aber zum Absturz, deshalb bin ich nicht weiter drauf eingegangen.

Nachtrag:

So, habe das jetzt so gemacht, beim 2. Durchlauf (i = 1) kommt es beim malloc zum Absturz:

Code:
void testFunc(char*** ppsz_array)
{
   *ppsz_array = (char **) malloc (sizeof (char *));

   for(int i = 0; i < 10; i++)
   {
      if(i > 0)
         *ppsz_array = (char **) realloc (*ppsz_array, (i + 1) * sizeof (char *));
      *ppsz_array[i] = (char *) malloc (100 * sizeof(char)); //-> Unhandled exception at 0x00401276 in testcpp60.exe: 0xC0000005: Access violation writing location 0xcccccccc.

      char sz_buff[10];
      itoa(i + 100, sz_buff, 10);

      strcpy(*ppsz_array[i], sz_buff);
   }

   for (int n = 0; n < 10; n++)
     printf ("%s\n", *ppsz_array[n]);
   //alles ok
}
 
Zuletzt bearbeitet:
Das mit dem Parameter verändern macht Sinn. Leider habe ich keine große C++-Erfahrung, kannst du mir bitte ein kleines Beispiel zeigen?
Warum verwendest du denn nicht eine std::list o.ä. wenn du C++ hast? Oder welche Sprache verwendest du?
C:
void testFunc(char*** ppsz_array)
{
  char** array = *ppsz_array;

   array = calloc(10, sizeof(*array));

   if (array == NULL) {
      perror("not enough memory");
      exit(1);
  }

   for(int i = 0; i < 10; i++)
   {
      array[i] = calloc(100, sizeof(**array));
      
      if (array[i] == NULL) {
         perror("not enough memory");
         exit(1);
      }
      //mit Werten füllen
      sprintf(array[i], "%d", i + 100);
   }
}
Gruß

\edit:
C:
*ppsz_array[i] = (char *) malloc (100 * sizeof(char)); //-> Unhandled exception at 0x00401276 in testcpp60.exe: 0xC0000005: Access violation writing location 0xcccccccc.
Der Dereferenzierungsoperator hat eine niedrigere Priorität als der Index-Operator, d.h. du versuchst etwas an *(ppsz_array[1]) zuzuweisen.
 
Zuletzt bearbeitet:
Danke deepthroat,

das Beispiel hat mir geholfen, jetzt klappt es wunderbar! Jetzt geht es zum nächsten Schritt, Übergabe an C#.

Danke nochmal!

Gruß

Lukas
 
Zurück