Mám takovou situaci že parsuju soubor a nevím kolik prvků bude obsahovat dané pole, které chci mallocovat. Vždycky přidělím paměť jednomu a pak to navýším když potřebuju další. A zajímá mě jestli velikost paměti uvnitř realloc počítám správně. Typ, který je v poli je NEW_LAYER_REQUEST_t. Počet požadavků je int new_layer_requests_count; Při realloc tedy dosazuji celkovou velikost paměti a předpokládám, že realloc z toho vypočítá přírůstek paměti o kolik se to má zvětšit. Nevím totiž jestli mám dávat jen přírůstek nebo celkovou velikost. A taky při tom doufám že data která jsou uložené v tom bufferu, který předávám do realloc se neztratí...
Jen je lepší alokovat třeba dvojnásobek paměti a mít ještě jednu proměnnou, která ti bude ukazovat, kolik z těch struktur je reálně využitých.
Alokace jsou totiž relativně časově drahý záležitosti, naopak RAM je dost (nepředpokládám že ta tvoje struktura zabírá nějak moc místa).
Srovnej si třeba situaci, kdy máš postupně naalokovat pole pro 1000 prvků. Zatímco s postupnou alokací budeš muset fakt zavolat 1000x realloc, tak pokud budeš alokovat dvojnásobek paměti (začneš pouze s jedním blokem), zavoláš pouze 10x realloc a za předpokladu že tvoje struktura zabírá např. 12 bajtů, ztratíš pouze 0.25 KB paměti... což je nic.
poprvé jsem allokoval paměť při w->layer_files[file_no].command_refs_count = 1; teď mám
w->layer_files[file_no].command_refs_count = 2 a má dojít k realokování paměti pro druhou položku.
w->layer_files[file_no].command_refs je NULL takže se ukončuje.
Pozn. zkoušel jsem navýšit paměť ještě 2x víc a stejně to skončí s pointerem NULL. jinak jsem už reallokaci dělal a fungovalo mi to. Dělám to na více místech a zrovna tohle pole mi fungovalo a teď přestalo.
Tak jsem to konečně vyřešil. Chyba byla v nesprávném typu z kterého zjišťuji velikost potřebné paměti. Jak jsem to původně kopíroval tak jsem tam měl takových podobných chyb více, že jsem tam nechal původní název. Tak jsem to vše dvakrát překontroloval a teď to už jede.