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;
    

Anmelden zum Antworten