🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #6196

Re: (Grandes) dudas sobre el funcionamiento de malloc() y realloc()

#6196
From: Iñaki Arenaza
Date: Sun, 20 Jul 2003 21:55
76 lines
4035 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "Han" == Han Solo <hsolo@escomposlinux.org> writes:

    Han> En principio, malloc() reserva memoria para 3 float, por eso
    Han> no entiendo por qu� demonios al asignar un valor a p[3], no
    Han> se sale fuera de su memoria.

Al margen de lo que te ha comentado Fernando en el otro mensaje, ahi
van un par de comentarios mas.

Cuando usas malloc/calloc y realloc, ademas de la memoria que tu
pides, las rutinas de gestion de memoria dinamica pueden (suelen)
reservar algo de memoria adicional para su propia gestion (por lo
general punteros hacia las siguientes zonas de memoria usadas, para
que sea mas facil hacer liberaciones y compactaciones de la memoria
libre fragmentada, etc, ademas del hecho de reservar multiplos de la
palabra de memoria para mayor velocidad de acceso y cosas asi).

De ahi que si te pasas de lo reservado, puede que no obtengas el
SEGFAULT sin mas. En todo caso, solo tienes derecho a usar la parte
que hayas pedido, ni un solo byte mas.

Por otra parte, realloc es una funcion traicionera. De entrada tienes
que pasarle un puntero valido, es decir, uno que contenga un valor
devuelto por malloc, calloc o realloc. De lo contrario, presupone
ciertas cosas (las que he mencionado mas arriba) y si no se cumplen,
lo mas normal es que se estrelle (SEGFAULT). Ademas, a veces te la
juega porque le pides una cantidad de memoria que no es posible
conseguir (puede que el espacio libre este demasiado fragmentado) y
como devuelve el valor de error por el mismo sitio (el valor de
retorno) que el puntero nuevo si todo va bien, este tipo de codigo:

         p = malloc (....);

         /* Hacemos cosas con *p, etc */

         p = realloc (p, ....);

son una trampa mortal, ya que si realloc falla, hemos perdido el unico
puntero valido a una zona de memoria dinamica, que ya no podremos
liberar con free al no tener un puntero a dicha zona. Por tanto lo
suyo es hacer algo como:

         p = malloc (....);

         /* Hacemos cosas con *p, etc */

         p2 = p;
         if ((p = realloc (p, ....)) == NULL ) {
             p = p2;
             /* realloc ha fallado, tratar el caso */
         }
         else {
             /* realloc ha tenido exito, seguir haciendo cosas */
         }


         /* ya no hace falta p */
         free (p);
         p = NULL;

Saludos. I�aki.

- -- 
  Get PGP/GPG Keys at  http://www.escomposlinux.org/iarenaza/pgpkey.php
  I use free software / Yo uso software libre
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.6 <http://mailcrypt.sourceforge.net/>

iD8DBQE/Gw++ZXLnGT1HLgcRAn9tAJ41dP91Ir8rAm/bNZMdhM1k4Hoe2QCbBkyi
lJjGfUHSsQAf9pf4JfLqlGM=
=ybDN
-----END PGP SIGNATURE-----
Technical Details
Message-ID: <873ch0vp6p.fsf@barad-dur.escomposlinux.org>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!headwall.stanford.edu!fu-berlin.de!news.eteo.mondragon.edu!not-for-mail
References: <86r84po6c8.fsf@pc147.ietcc.csic.es>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,87b737dc79fbe16
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2003-07-20 14:55:14 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!headwall.stanford.edu!fu-berlin.de!news.eteo.mondragon.edu!not-for-mail
From: iarenaza@eb2ebu.ampr.org (Iñaki Arenaza)
Newsgroups: es.comp.os.linux.programacion
Subject: Re: (Grandes) dudas sobre el funcionamiento de malloc() y realloc()
Date: Sun, 20 Jul 2003 23:55:10 +0200
Organization: Mondragon Unibertsitatea - ETEO
Lines: 76
Distribution: es
Message-ID: <873ch0vp6p.fsf@barad-dur.escomposlinux.org>
References: <86r84po6c8.fsf@pc147.ietcc.csic.es>
NNTP-Posting-Host: 22.red-80-38-245.pooles.rima-tde.net
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: poseidon.eteo.mondragon.edu 1058738113 25834 80.38.245.22 (20 Jul 2003 21:55:13 GMT)
X-Complaints-To: newsmaster@eteo.mondragon.edu
NNTP-Posting-Date: Sun, 20 Jul 2003 21:55:13 +0000 (UTC)
User-Agent: Gnus/5.090006 (Oort Gnus v0.06) Emacs/20.7
 (i386-debian-linux-gnu)
Cancel-Lock: sha1:jDSpKtSmH6N7+Iiz9akpCh1kpTc=