Ask Your Question
1

Realokace dynamického pole ve vedlejší funkci

asked 2014-11-24 19:22:58 +0100

syvotouf gravatar image

updated 2014-11-24 21:28:32 +0100

Miro Hrončok gravatar image

Ahoj, potřeboval bych poradit. Tvořil jsem si funkci (viz níže), která by zvětšovala dynamicky alokované pole. Problém ale je že při hodnotě ZVETSENI 1.99 funguje zcela správně jak má ale už při hodnotě ZVETSENI 2.0 se rozbije a do pole dává na některé (ano jen na některé) pozice nesmyslné údaje (nějaký šrot v paměti). Byl bych rád kdyby někdo poradil, jak funkci upravit aby fungovala, nevím v čem je chyba. Díky moc

Kód zde: pastebin.com/5H3RsUDN

edit retag flag offensive close delete

2 Answers

Sort by » oldest newest most voted
0

answered 2014-11-24 21:04:04 +0100

Greg gravatar image
#include <stdio.h>
#include <stdlib.h>

void realokuj(int ** array, int * aktualni_delka, double nasobek) {
    *array = (int *)realloc(*array, (*aktualni_delka *= nasobek) * sizeof(int));
}

int main(void) {
    int delka = 9;
    int * pole = (int *)malloc(delka * sizeof(int));

    realokuj(&pole, &delka, 1.5);
    realokuj(&pole, &delka, 12);

    free(pole);
    return 0;
}
edit flag offensive delete publish link more

Comments

Z této odpovědi bych si bez přečtení odpovědi od @Viktor Chlumský upřímně moc neodnesl.

Miro Hrončok ( 2014-11-25 07:08:56 +0100 )edit

Já to sem právě hodil jako doplnění odpovědí od @Viktor Chlumský ;-).

Greg ( 2014-11-25 10:50:52 +0100 )edit
2

answered 2014-11-24 20:59:53 +0100

Viktor Chlumský gravatar image

Řek bych, že je to kvůli tomu, že neukládáš nový pointer po realokaci. Pokud nelze pole prodloužit na místě (něco už je za ním), je potřeba celé pole přesunout jinam, a tím se po volání funkce realloc adresa pointeru změní, ale už se nedostane ven z funkce realokuj, takže v mainu pak čteš to staré přesunuté pole, a k tomu něco cizího za ním.

Funkce realokuj by teda měla mít i to pole jako vstupně výstupní parametr podobně jako aktualni_delka, tzn. dvojitý pointer int **arr.

edit flag offensive delete publish link more

Comments

A z jakého důvodu mi to ovlivní i například první 2 prvky prvního pole? Obvykle jsem pak dostal něco ve stylu 43208439 42398394843 2 3 4 5 6 7 8 9 382938 398249284 ...

syvotouf ( 2014-11-25 07:48:08 +0100 )edit

Protože se už pak odkazuješ na nějakej starej blok paměti, se kterým má OS očividně jiný plány. Ten realloc ti na něj zavolal free.

Greg ( 2014-11-25 11:05:48 +0100 )edit

Já to takto chápu, jen nevím proč se liší výsledky prvních 9 prvků od ukazatele na to pole co je v mainu. Prvních 9 prvků od bez realokací: > 0 1 2 3 4 5 6 7 8 Prvních 9 prvků po provedených realokacích: > 7681360 7673608 2 3 4 5 6 7 8 Znamená to že tam ten 3. až 9. prvek zůstali pořád viset nezměněné v paměti a do pozic 1. a 2. prvku už systém nasypal nějaká jiná data?

syvotouf ( 2014-11-25 12:08:39 +0100 )edit

Jop, přesně tak.

Greg ( 2014-11-25 12:14:16 +0100 )edit

Proč by mělo uvolnění paměti mazat data, která tam jsou? Na první dvě pozice se něco zapsalo, težko říci co, protože neznáme zbytek programu, a zbytek prostě zůstal.

Radomír Polách ( 2014-11-30 01:49:47 +0100 )edit

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: 2014-11-24 19:22:58 +0100

Seen: 837 times

Last updated: Nov 24 '14