Realloc – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Realloc – C / C++ – Fórum – Programujte.comRealloc – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
oxidián0
Grafoman
4. 3. 2015   #1
-
0
-

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í...

 

w->layer_files[file_no].new_layer_requests_count++;
// TODO: solve malloc/realloc size:
if (w->layer_files[file_no].new_layer_requests_count == 1)
    w->layer_files[file_no].new_layer_requests = malloc(sizeof( NEW_LAYER_REQUEST_t ) );
else
    w->layer_files[file_no].new_layer_requests = realloc(w->layer_files[file_no].new_layer_requests,
                         w->layer_files[file_no].new_layer_requests_count * sizeof( NEW_LAYER_REQUEST_t ) );
Nahlásit jako SPAM
IP: 78.45.199.–
PiranhaGreg0
Stálý člen
4. 3. 2015   #2
-
0
-

Takhle by to mělo být OK.

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.

Nahlásit jako SPAM
IP: 195.113.241.–
oxidián0
Grafoman
4. 3. 2015   #3
-
0
-

Děje se mi to, že realloc vrací pointer NULL. Čím to může být?

w->layer_files[file_no].command_refs_count = 2;

w->layer_files[file_no].command_refs = realloc(w->layer_files[file_no].command_refs,
       w->layer_files[file_no].command_refs_count * sizeof( NEW_LAYER_REQUEST_t ) );

if (!w->layer_files[file_no].command_refs)
       abort_parseLayerFile(w, file_no, buffer, -5);

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.

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Grafoman
4. 3. 2015   #4
-
0
-

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.

Nahlásit jako SPAM
IP: 78.45.199.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 76 hostů

Podobná vlákna

Realloc — založil Martin

Realloc() — založil Kuba-$

Realloc a NULL — založil olgo

Realloc matice — založil constantine

Proč padá funkce po realloc? — založil oxidián

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý