Ich habe eine while
Schleife innerhalb einer for
Schleife, um Strings zu behandeln. Hier ist im Grunde die Struktur meines Code:Probleme mit free() Funktion in C
char myString[1000];
//Initialize and maybe change myString
for(/*conditions*/){
while(/*conditions*/){
if(strchr(myString,' ') == NULL){
break;
}
char *temp = malloc(sizeof(char) * strlen(myString));
strcpy(temp,myString);
*strchr(temp,' ') = '\0';
strcat(myString," ");
strcat(myString,temp);
free(temp);
}
}
Manchmal dieser Code funktioniert gut, aber manchmal endet der Prozess und gibt 3, was bedeutet, dass es einen Fehler (3 wird der Rückgabewert, dass ich in der Regel erhalten, wenn Ich versuche, NULL zu verwenden, wo ich nicht wie zum Beispiel myPointer->example
wo myPointer
ist NULL) mögen sollte. Nach einigen Tests fand ich heraus, dass die Linie, die das Problem verursachte, free(temp);
ist. Ich habe versucht, es durch if(temp != NULL){free(temp);}
zu ersetzen, aber es änderte nichts. Ich habe versucht, temp
mit char temp[1000]
anstelle von malloc
zu deklarieren und die free(temp);
Linie wegzunehmen, aber es tut immer noch das Gleiche. Wenn ich die free(temp);
Zeile wegnehme und immer noch malloc
benutze, ist das Problem gelöst, aber stattdessen gibt es ein riesiges Speicherleck, also kann ich das nicht tun. Wenn es einen Fehler gibt oder nicht, hängt davon ab, was in der myString
Zeichenfolge ist, was bedeutet, dass, wenn dort ein bestimmter Wert ist, immer ein Fehler auftritt, und wenn es einen anderen bestimmten Wert gibt, gibt es nie einen Fehler, aber ich kann nicht herausfinden, welche Art von Werten funktionieren und welche nicht, es scheint zufällig zu sein.
Warum funktioniert free(temp);
manchmal und manchmal nicht und wie kann ich es immer funktionieren?
'char * temp = malloc (sizeof (char) * strlen (myString)); strcpy (temp, myString); Out-of-Bounds schreiben, undefiniertes Verhalten. Undefiniertes Verhalten für 'NULL'-Dereferenz, wenn' strchr() '' NULL' zurückgibt. – EOF
Außerdem ist 'sizeof (char)' eine Definition, daher ist es redundant als Teil des an 'malloc() 'übergebenen Arguments. –
Ich stimme für die Schließung dieser Frage, weil das Problem durch einen einfachen Tippfehler verursacht wurde. –