2017-08-21 2 views
0

Ich habe einige Probleme mit diesem Code-Snippet.Ungültiges Schreiben in Realloc-Aufruf

size_t* defines = malloc(sizeof *defines); 
if (!defines) 
    exit(1); 

size_t def_cap = 1; 
size_t def_size = 0; 

... 

for(condition) { 
    ... 

    if (def_size == def_cap) { 
     void* tmp = realloc(defines, def_cap*=2); 
     if(!tmp) 
      exit(1); 
     defines = tmp; 
    } 
    defines[def_size++] = foo; 
} 

Ich erhalte eine "malloc.c: 2842: mremap_chunk. Assertion` ((Größe + Offset) & (_rtld_global_ro._dl_pagesize - 1)) == 0' ist fehlgeschlagen" Fehler beim Ausführen. Valgrind sagt mir, dass es einen ungültigen Schreibvorgang der Größe 8 im Realloc-Aufruf gibt. Was ist los? Bedingung und foo sind Teil einer Unordnung der Dateianalyse, die keine der oben genannten Variablen verwendet oder modifiziert.

+1

Haben Sie (zB Erhöhung,) 'defines' irgendwo ändern? – tkausl

+1

Es scheint, dass Sie die Heap-Datenstrukturen durch Überschreiben einiger Datenbereiche außerhalb des zugewiesenen Bereichs beschädigt haben. Dies könnte aufgrund eines unkontrollierten Zugriffs geschehen sein. Der Code, der im '...' steckt, ist wichtig, um das herauszufinden. –

+0

@tkausl Kontrolle F sagt nein. – SonicN

Antwort

3

realloc nimmt eine Anzahl von Bytes wie malloc, so müssen Sie die Anzahl der Einträge von sizeof(size_t) wie zuvor multiplizieren:

def_cap *= 2; 
void* tmp = realloc(defines, def_cap * sizeof *defines); 
Verwandte Themen