Problem mit free
-
C99 kennt auch die // Komentare
(ja ja das wird immer falsch erklärt - es heißt dann immer C kennt nur den mehrzeilenkomentar - aber das hat sich spätestens seit 1999 geändert)
es lag am dem sizeof operator - mit strcpy hab ich anscheinend in eine speicherbereich geschreiben der mir nicht gehört und bei free gab es dann die ersten prolbeme damit
-danke es funzt jetzt
-
Vertexwahn schrieb:
C99 kennt auch die // Komentare
ja, das weiß ich, aber /* */ sieht es bei C einfach besser
Vertexwahn schrieb:
es lag am dem sizeof operator - mit strcpy hab ich anscheinend in eine speicherbereich geschreiben der mir nicht gehört und bei free gab es dann die ersten prolbeme damit
-danke es funzt jetztes lag daran, dass du den Speicher auch falsch reserviert hast.
-
UserInput *newUserInput(int argc, char *argv[]) { UserInput *newInput = NULL; if(argc != 4) return NULL; // to less or to much arguments if(atoi(argv[3]) < 0 || atoi(argv[3]) > 1) return NULL; newInput = malloc(sizeof(UserInput)); // get memory newInput->BottomImageFilename = malloc(strlen(argv[1])+1u); newInput->TopImageFilename = malloc(strlen(argv[2])+1u); // fill user input structure strcpy(newInput->BottomImageFilename, argv[1]); strcpy(newInput->TopImageFilename, argv[2]); newInput->AlphaBlendFactor = (float)(atof(argv[3])); return newInput; }
Speicherreservierung immer noch falsch?
-
Vertexwahn schrieb:
Speicherreservierung immer noch falsch?
sieht gut aus, aber schreib 1 statt 1u das sieht daemlich aus.
-
was für welche Fehler kommen denn? Überprüfe immer, dass malloc kein NULL zurückgibt. So kann ich nicht sagen, was falsch ist, weil der Code schon gut aussieht (mit Ausnahme von dem 1u)
edit: oder war deine Frage so, dass wir sagen, ob das gut gemacht ist? Dann: überprüfe immer, dass malloc kein NULL zurückgibt
-
Shade Of Mine schrieb:
sieht gut aus, aber schreib 1 statt 1u das sieht daemlich aus.
wenn der Compiler auf den Wert 1 stößt dann interpretiert er das doch als Integer - wenn er auf 1u trifft dann interpretiert er das als unsigned int
ist es eigentlich definiert wie die adition zwischen einem usigned int + int abläuft? wenn mich es nicht täuscht wird der unsigned int in einen int umgewandelt - dann werden die beiden int addiert und anschließend wird dieser int dann in einen unsigned int gepackt ohne rücksicht auf verluste
ich fühl mich einfach wohler mit 1u
oder ist das unberechtigt?
-
supertux schrieb:
edit: oder war deine Frage so, dass wir sagen, ob das gut gemacht ist?
yup - ich wollte nur wissen ob es so paßt - bei mir gibt es mit dem code keine probleme - mmmh mal sehen ob ich mir das 1u noch abgewöhne...
-
Vertexwahn schrieb:
Shade Of Mine schrieb:
sieht gut aus, aber schreib 1 statt 1u das sieht daemlich aus.
wenn der Compiler auf den Wert 1 stößt dann interpretiert er das doch als Integer - wenn er auf 1u trifft dann interpretiert er das als unsigned int
ist es eigentlich definiert wie die adition zwischen einem usigned int + int abläuft? wenn mich es nicht täuscht wird der unsigned int in einen int umgewandelt - dann werden die beiden int addiert und anschließend wird dieser int dann in einen unsigned int gepackt ohne rücksicht auf verluste
ich fühl mich einfach wohler mit 1u
oder ist das unberechtigt?
das ist doch egal, weil strlen etwas >= 0 zurückliefert und 1 bereits positiv und "unsigned" ist, das heißt, dass bei der Umwandlung nichts verloren geht. Deshalb lass das u weg, vertrau uns.
-
supertux schrieb:
das ist doch egal, weil strlen etwas >= 0 zurückliefert und 1 bereits positiv und "unsigned" ist, das heißt, dass bei der Umwandlungnichts verloren geht. Deshalb lass das u weg, vertrau uns.
mmmh - irgendwo hab ich gelesen, dass alles was ganzzahlig ist als signed int interpretiert wird - falls es nicht mir in nen signed in paßt wirds als signed long interpretiert - mmh... ist das jetzt richtig oder falsch?
-
Vertexwahn schrieb:
ich fühl mich einfach wohler mit 1u
oder ist das unberechtigt?
Ist korrekt. size_t ist immer unsigned (siehe aktueller C Standard Kapitel 7.17).
Fuer Konvertierungen zwischen signed und unsigned-Typen siehe Kapitel 6.3.1.1 und 6.3.1.3 (des aktuellen C Standards). I.d.R. wird die Konvertierung dann vorgenommen, wenn sie gebraucht wird. "signed int" und "unsigned int" haben den gleichen Rang. D.h. es wird in Ausdruecken eine Konvertierung in den Zieltyp vorgenommen (integer promotion).
Fuer "sizeof(x) + 1" bedeutet das, das "1" nach "unsigned int" konvertiert werden muss. "1u" ist sauberer und macht klar, dass der Ausdruck "unsigned" ist.
Bei der Konvertierung von "signed int" nach "unsigned int" wird wegen desselben Ranges aber i.d.R. keine Compiler-Warnung ausgegeben.