Keifor hat geschrieben:Valgrind hat schon die richtige Antwort gegeben. Ein teil der Variablen ist nicht (vollständig) initialisiert für die Nutzung.
C String Operationen (strcpy/strlen/strcat/... und dergleichen auf char*) gehen von Null-terminierten Zeichenketten aus. So werden in den Zeichenketten halt die enden markiert.
Malloc holt nur Speicher ran, initialisiert in aber nicht. Wenn du eine leere Null-Terminierte Zeichenkette brauchst, dann mach sowas:
Code: Alles auswählen
char* string = (char*)malloc(100 + 1); // 100 zeichen, +1 fuer terminierung
string[0] = 0; // string ist nun leer
machen hier 101 wirklich sin, wenn ich max 8+1 brauche?
Keifor hat geschrieben:Beispiel bei deinem code, setze hex[0] = 0; nach dem Speicher ranholen, sonst baut strcat( hex, tmp ) einfach den Müll in hex bis zum ersten 0 an den Anfang. Analog für bin/okt.
Jopp! schaut schon besser aus.
Keifor hat geschrieben:Anmerkung 2: Dein Code hat noch viel Potential für Optimierungen.

Leider. Vermute mal, das du damit auch die Bezeichnung der Funktionen sowie der Parameter meinst. die main fliegt sowieso raus, da die nur zum Test drinne ist für die Konsole. Werd erst mal versuchen die functionen so in die -so zu bekommen, und denne versuchen zu optimieren.
Hmmm die ftk ctb hab ich kürzen könne. und schaut nun so aus.
Code: Alles auswählen
char *ctb(unsigned short usocfe) // usocfe = Zeiger "unsigned short of cfe"
{
char *bin = malloc(sizeof(char) * (8 + 1)); // Speicher aus 9 resavieren
char *temp = malloc(sizeof(char) * (8 + 1)); // -------------"------------
char b[2] = "0"
bin[0] = temp[0] = 0;
int a;
for (a=0; a<=7; ++a)
{
b[0]=(char)(usocfe%BIN)+48;
usocfe=usocfe/BIN;
strcpy(temp, b);
strcat(bin, temp);
}
strcpy(temp, bin);
free(temp);
return(bin);
}
wenn ich die nun noch sichtig kommentiere, sollt ich die Grundlagen dann doch schon verstanden haben. auch was das casten angeht.
carli hat geschrieben:Und einen char *zurückgeben zu lassen ist auch nicht gerade schlau, da der Speicher dann nicht mehr der Lib gehört.
Zumindest solltest du den Lebenszyklus des allokieren Speichers im Überblick behalten.
carli hat geschrieben:Ansonsten mach's so wie die WinAPI: Gib der Lib nen Platz, wo sie den Speicher hinkopieren soll und eine Maximallänge.
Den Speicher reservierst du vom Programm und ist somit voll unter deiner Kontrolle.

sowas vie z.B. den Speicher via Adresse vordefinieren?

WinAPI kenn ich mich net aus.