C Zugriff auf zweidimensionales char-Array

wenn jetzt verdammtes valgrind auf bash for windows laufen würde ohne dass ichs selbst bauen muss...
ich kann mir sehr gut vorstellen, dass der Code jetzt nur "anders falsch" ist und zufällig funktioniert. deshalb lass doch mal valgrind drüber laufen und schau ob deinen memzugriffe immer anständig sind :)
 
Warum kein C++? Das würde viele unschöne Stellen deutlich vereinfachen und über myVector.size() oder myVector.at() auch automatisch Fehler aufzeigen.
 
Zuletzt bearbeitet:
Der Fehler in Deinem ursprünglichen Code
Code:
int mirror_symbol_stream(mirror_field_t* mf, char* input, uint32_t length, char* output)
{
        for(int i = 0; i < length;i++) {
            const char c = mirror_symbol(&*mf,input[i]);
            strcat(output,&c);
            printf("Der %d. Buchstabe ist ein: %c\n",i,c);
        }
        return 0;
}
liegt in der Zeile 5
strcat(output,&c);
So wie Du strcat aufrufst überschreibt er Dir in Zusammenhang mit dem Speicherlayout von C Deine anderen Parameter, in diesem Fall Deinen Parameter mf und somit bekommst Du dann den Fehler in Zeile 71.

"Kurz" erläutert:
Der C-Compiler legt die Parameter, die Du der Funktion übergibst auf dem Stack ab. Die Reihenfolge ist zwar im Standard nicht vorgeschrieben aber der MS-Compiler unter Windows legt sie von rechts nach links auf dem Stack ab. D.h. der Parameter am weitesten rechts (in Deinem Fall output) landet auf der niedrigsten Adresse im Speicher. Die anderen Parameter folgen. Dadurch hast Du ein Speicherlayout wie folgt:
[table="width: 400, class: grid, align: left"]
[tr]
[td]Höhere Adresse[/td]
[td]mf[/td]
[/tr]
[tr]
[td][/td]
[td]input[/td]
[/tr]
[tr]
[td][/td]
[td]length[/td]
[/tr]
[tr]
[td]Niedrigere Adresse[/td]
[td]output[/td]
[/tr]
[/table]
Durch den falschen Einsatz von strcat überschreibst Du irgendwann (daher die unterschiedlichen Zeitpunkte des Crashs) Deinen Zeiger auf mf. Dadurch zeigt mf nicht mehr auf den ursprünglichen Speicherbereich, sondern irgendwohin und das geht dann halt mal schief. Wenn Du schon strcat verwenden willst, dann verwende an der Stelle strncat und rufe es folgendermassen auf:
strncat(output,&c,1);
Dann sollte auch Deine ursprüngliche Fassung funktionieren.
 
danke :) dann muss ich das jetzt nicht selbst suchen... weil neugierig war ich schon.
 
Zurück
Oben