Hallo,
ist 'ne Menge Code so auf einmal ...
while (*line++ != '\0') {
if (*line == SEPARATOR)
seperatorCount++;
}
Diese Vergleichsoperation ist umständlicher als nötig.
Eine Prüfung eines Wertes auf nicht-null ist genau das, was die if-Anweisung sowieso tut. Außerdem ist es IMHO für die Lesbarkeit des Quellcodes ungünstig, '\0' zu schreiben, wo es eine einfache 0 genauso täte. Insgesamt also:
while (*line++) {
//reset Pointer
line -= totalStringSize+1;
printf("Pointerreset Test, inputline: %s\n", line);
Das sieht korrekt aus, nachdem du ja vorher die Stringlänge bestimmt hast; trotzdem habe ich bei dieser Operation ein ungutes Gefühl.
stringlist[0] = (char*)malloc(seperatorCount*sizeof(int));
Abgesehen davon, dass der Typecast (char*) den Ausdruck für den Leser unnötig verkompliziert: FEHLERQUELLE! Auf 32bit-Intel-kompatiblen Systemen geht das gut. Es ist aber nicht auf allen Systemen sizeof(int)==sizeof(*).
Aber was noch viel schlimmer ist: Du reservierst hier nicht Speicher für stringlist, sondern für stringlist[0]! Das sollte aber schon der Zeiger auf den ersten String sein. Anhand der Logik deiner Funktion gehe ich davon aus, dass stringlist beim Aufruf undefiniert sein darf - du greifst aber schon auf das erste Element zu, auf das dieser undefinierte Zeiger zufällig verweist. Das dürfte dein entscheidender Fehler sein.
// Ermittle die Teilzeichenketten
int stringBufferCounter = 0;
char stringBuffer[totalStringSize];
int stringlistCounter = 0;
Es ist schlechter Stil, mitten in der Funktion neue Variablen einzuführen. Das ist eine Schlamperei, die mit C++ erst aufgekommen ist; bei einem reinen C-Compiler ergibt das eine Fehlermeldung. Variablen müssen immer am Anfang eines Blocks deklariert werden.
// Allokiere für jede Teilzeichenkette den notwendigen Speicher
while (*line != '\0') {
Siehe oben.
else {
stringBuffer[stringBufferCounter++] = '\0';
Auch hier: Warum '\0' und nicht 0? Schließlich ist C von Haus aus schon in manchen Punkten umständlich, man muss es ja nicht noch übertreiben. :-)
printf("gepuffert wurde %s\n", stringBuffer);
printf("alloziere %d*%d Speicher für stringlist[%d]\n", stringBufferCounter, sizeof(char), stringlistCounter);
stringlist[stringlistCounter]=(char*)malloc(stringBufferCounter*sizeof(char));
Hier ist die Indizierung richtig.
printf("setze stringlist[%d]\n", stringlistCounter);
stringlist[stringlistCounter]=stringBuffer;
Hier nicht. Du überschreibst den Zeiger auf den eben reservierten Speicherblock wieder mit dem Zeiger auf deinen lokalen (und damit temporären) Speicherplatz stringBuffer.
An dieser Stelle willst du vermutlich strcpy() oder eine der Varianten davon einsetzen.
stringBuffer[1] = '\0';
Was will mir die Konstante 1 hier sagen?
"stringlist[stringlistCounter]=(char*)malloc(stringBufferCounter*sizeof(char));"
soll eigentlich jedem Element des String-Arrays einen weiteren freien Speicher zuordnen. Das ist aber immer die selbe Adresse.
Aber nur, weil du die von malloc() gelieferte Adresse gleich wieder überschreibst.
Wie man sieht, bleibt der Pointer "hängen". Was mach ich falsch? Ich dachte schon, ich blick durch, aber jetzt kurz vor Schluss den Wald vor lauter Bäumen nicht.
Es sind meistens nur Kleinigkeiten ...
Übrigens: In Zeile 58 "stringBuffer[1] = '\0'"; hatte ich zum Testen gesetzt, um die Ausgabe in Main nachvollziehen zu können (
Ach so. Mich hat's jetzt verwirrt.
So long,
Martin
--
Wer schläft, sündigt nicht.
Wer vorher sündigt, schläft besser.