Re: Problem z realloc

Autor: Leszek Kubrak (infokub_at_nw.pp.com.pl)
Data: Mon 28 Aug 2000 - 09:00:58 MET DST


On Mon, 28 Aug 2000 08:42:36 +0200 (MET DST), Tomasz Szczesniak wrote:

>Hello Leszek.
>
>25 Aug 00 11:18, Leszek Kubrak wrote to All:
>
> >> W emx-ie natknęłem się używając ww. funkcji na pewien problem -
> >> nastepujący fragment kodu: char *tekst; //Tu alokujemy pamięć i
> >> tworzymy łańcuch pod wskaźnikiem tekst printf ("%s\n", tekst); tekst
> >> = realloc (tekst, strlen (tekst) + 10); printf ("%s\n",
> >> tekst); działa niepoprawnie Druga funckja printf wypisje tylko część
> >> początkowego łańcucha, a powinna cały! Dalej są już tylko same znaki
> >> NULL. To jakiś bug emx-a, czy ja coś źle robię?
> LK> Teretycznie wygląda to poprawnie. Być może problem tkwi w wierszu
> LK> "//Tu alokujemy pamięć...".
> LK> Podaj dokładnie co tam robisz.
>
>To musiałbym ze 200 linii tu przepisać. Ogólnie jest to pętla, która odputuje
>bazę danych, a rekordy zgodne dopisuje jeden za drugim do bufora, który musi się
>ciągle rozrastać. Mógłbym niby zarezerwować statycznie jakiś duży kawał pamięci
>i zrobić tylko blokadę na nadmiernie duży rozmiar wyniku, ale dla mnie to jakoś
>nieelegancko wygłada. A pierwszy obieg pętli przechodzi poprawnie - łańcuch
>zawiera odpowiednio przepisaną wartośc rekordu. Przy pierwszym reallocu wszytsko
>się krzaczy w sposób wyżej opisany. Wartość długości obszaru przekazywanej
>funkci realloc też sprawdzam, i jest OK.
>

Ale przecież printf pisze zawsze od początku bufora. Tak więc po wyjściu
z pętli masz wielki bufor (o długości n*10), w którym jest zapisany wynik
ostatniej operacji printf. A dalej są same NULL-e, bo widocznie taka jest
implementacja funkcji realloc, że zeruje przydzielony blok pamięci.

Jeżeli chcesz mieć w buforze połączone teksty z kolejnych rekordów, to musisz
użyć funkcji strcat, lub printf ("%s\n", tekst+strlen(tekst) ).

==================================================
Leszek KUBRAK <infokub_at_pp.com.pl>

P.U.I. "InfoKub" tel.0-602-673124
os.Kolorowe 25/5 tel.(0-12)425-04-40
31-941 KRAKÓW fax.(0-12)425-04-41



To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 15:28:15 MET DST