wieder einmal malloc
-
Hallo,
mein Programm/Ausschnitt sieht folgender maßen aus.
int lesen_vardatei(blockkennung **block) { ... ... if (mpi_old != mpi) { if (*block == NULL) { max_block++; *block = realloc(NULL , max_block * sizeof(blockkennung)); (*block)[max_block].verbindung = true; (*block)[max_block].Socket = -1; (*block)[max_block].fehlerzaehler= 0; anz_datenlist = 1; if ((*block) == NULL) { schreibeLogeintrag("MPI-Treiber: Speicherfehler in der Funktion \"lesen_config\"."); return -1; } } else { max_block++; memzeiger = realloc(*block , max_block * sizeof(blockkennung)); *block = memzeiger; (*block)[max_block].verbindung = true; (*block)[max_block].Socket = -1; (*block)[max_block].fehlerzaehler= 0; anz_datenlist = 1; }
Ich übergebe einen Zeiger und reserviere Speicherplatz. Sobald ich an diese Zeile komme (Speicher vergrößern)
memzeiger = realloc(*block , max_block * sizeof(blockkennung));
stürzt das Programm ab. (Speicherfehler)
Irgendwie sehe ich es nicht
Gruß
worst_case
-
Sorry...
Anfängerfehler
if (mpi_old != mpi) { if (*block == NULL) { max_block++; *block = realloc(NULL , max_block * sizeof(blockkennung)); (*block)[max_block].verbindung = true; (*block)[max_block].Socket = -1; (*block)[max_block].fehlerzaehler= 0; anz_datenlist = 1;
Ich erzeuge 1 x Speicherbereich und schreibe auf Array 1. Ich muß natürlich auf Array 0 schreiben.... ganz einfach :xmas2:
Gruß
worst_case
-
worst_case schrieb:
... memzeiger = realloc(*block , max_block * sizeof(blockkennung)); *block = memzeiger;
der Sinn, so realloc aufzurufen, ist es, dass wenn realloc NULL zurückliefert, verliert man dann den ursprünglichen Pointer nicht. Da du nicht überprüfst, ob mezeiger NULL ist, kannst du gleich
*block = realloc(*block , max_block * sizeof(blockkennung));
schreiben. Aber ich empfehle:
... memzeiger = realloc(*block , max_block * sizeof(blockkennung)); if(memzeiger == NULL) { FEHLER BEHANDLUNG, sofort aufhören, was auch immer. } *block = memzeiger;