malloc() schießt prozess ab?
-
Hi alle.
ich wollt ma fragen obs bei malloc() irgendwas kritisches gibt.
ich parse eine zeile aus einer datei, und für jede Zelle dieser zeile reserviere ich mit malloc() ausreichend Speicher. Beim 3. durchlauf (also bei der dritten Zelle) stirbt das Programm beim malloc() aufruf.
Hab das getestet, mit einer messagebox davor und danach. Die danach wird beim 3. durchlauf nichtmehr angezeigt.So sieht der aufruf aus:
if(!cTmp) cTmp = (char *)malloc(2);
also nichts spektakuläres.
ich hoffe jemand ann mir weiterhelfen.
danke schon im voraus
-
@sMogli, ich glaube nicht, dass malloc den Fehler verursacht. Zeig mal noch etwas mehr von deinem Code. Der Fehler ist dort zu suchen, wo du etwas mit dem Speicher machst...also nach deinem ersten malloc...denke ich
-
Hi,
unmöglich dazu was zu sagen. Da muss schon mehr Code her.
-
for(unsigned int i = 1; i < strlen(cLine); i++) { if(((flag<6)?cLine[i] == '\"':true) && cLine[i+1] == ';' && cLine[i-1] != '\\') { //New column char la[64]; sprintf(la, "flag: %i; i: %i\n%s", flag, i, cTmp); MessageBox(NULL, la, "", MB_OK); if(flag == 0) { cKursNr = cTmp; cTmp = NULL; MessageBox(NULL, "Case0", "", MB_OK); } else if(flag == 1) { cKursName = cTmp; cTmp = NULL; MessageBox(NULL, "Case1", "", MB_OK); } else if(flag == 2) { cKursDauer = cTmp; cTmp = NULL; } else if(flag == 3) { cKursInhalte = cTmp; cTmp = NULL; } else if(flag == 4) { cKursErklaerung = cTmp; cTmp = NULL; } else if(flag == 5) { bWirdAngeboten = (!strcmp(cTmp, "0")?false:true); MessageBox(NULL, "case 5:", (bWirdAngeboten)?"true":"false", MB_OK); cTmp = NULL; } else if(flag == 6) { MessageBox(NULL, "Case 6 MAN!", "", MB_OK); bAuswahl = (!strcmp(cTmp, "0")?false:true); MessageBox(NULL, "case 6:", cTmp, MB_OK); cTmp = NULL; } strcpy(cLine, cLine + i + ((flag<5)?2:1)); i = 1; flag++; } if(flag == 2) MessageBox(NULL, "if(!cTmp", "", MB_OK); if(!cTmp) cTmp = (char *)malloc(2); else cTmp = (char *)realloc(cTmp, sizeof(cTmp) + 1); if(flag == 2) MessageBox(NULL, "after reallocation", "", MB_OK); cTmp[i-1] = cLine[i]; cTmp[i] = '\0'; if(flag == 2) MessageBox(NULL, "end of loop", "", MB_OK); } //MessageBox(NULL, cKursErklaerung, cKursNr, MB_OK | MB_ICONINFORMATION); KURSE *pNew = (KURSE *)malloc(sizeof(KURSE)); pNew->cKursNr = (char *)malloc(strlen(cKursNr) + 1); pNew->cKursName = (char *)malloc(strlen(cKursName) + 1); pNew->cKursDauer = (char *)malloc(strlen(cKursDauer) + 1); pNew->cKursInhalte = (char *)malloc(strlen(cKursInhalte) + 1); pNew->cKursErklaerung = (char *)malloc(strlen(cKursErklaerung) + 1); pNew->bWirdAngeboten = bWirdAngeboten; pNew->bAuswahl = bAuswahl; strcpy(pNew->cKursNr, cKursNr); strcpy(pNew->cKursName, cKursNr); strcpy(pNew->cKursDauer, cKursNr); strcpy(pNew->cKursInhalte, cKursNr); strcpy(pNew->cKursErklaerung, cKursNr); MessageBox(NULL, pNew->cKursNr, pNew->cKursErklaerung, MB_OK | MB_ICONINFORMATION); AddKurs(pNew); }
isn kleiner ausschnitt...ich denke das sollte reichen
-
Ich hab mir den Code jetzt nicht audgiebig angeschaut allerdings ich würde darauf tippen, dass du einen Bufferoverflow hast und dir dadurch den Heap zerschossen hast und malloc deshalb fehl schlägt.
-
aber wo? *G*
also _EIGENTLICH_ sollte der buffer immer groß genug sein ... ich hab übrigens keine switch() anweisung genommen weil er, egal wie der wert war, immer case 0 aufgerufen hat. Also hab ichs mit if/else if geregelt. Kann das vielleicht auch damit im zusammenhang sein?bin hier am verzweifeln weil ich alles schon ausprobiert hab...
-
sMogli schrieb:
cTmp = (char *)realloc(cTmp, sizeof(cTmp) + 1);
Was tust du da?
-
ich parse eine datei, die in ihrer syntax so aussieht:
"wort1";"wort2";"wort3"
weil die worte aber keine maximale länge haben sollen, werden sie dynamisch groß gemacht.zeile für zeile lauf ich jedes zeichen ab und prüfe ob wieder ";" kommt. wenn nicht, wird der temporäre puffer wieder um einen byte vergrößert, damit der neue buchstabe platz hat. danach wird flag erhöht (damit das programm weiß, dass die nächste variable jetzt dran ist), und das gleiche spiel beginnt von vorn.
-
Es ging mir schon konkret um die Zeile, die ich zitiert habe.
Nur als Tipp:
sizeof(cTmp) == sizeof(char*) == 4 (auf den heute üblichen Windowssystemen)
Ist vielleicht nicht das, was du willst.
-
omg ja stimmt ... is ja klar ...
denkfehler
dane auf jeden Fall ... nu funkts