Article View: es.comp.os.linux.programacion
Article #11536Re: Segmentation fault
From: Ripe/7a69
Date: Wed, 31 Oct 2001 04:39
Date: Wed, 31 Oct 2001 04:39
89 lines
3399 bytes
3399 bytes
Fco. Javier Espejo wrote:
>>Por ejemplo, pasan a una funci�n un puntero, que apunta a una zona de la
>>memoria ya alojada. La funci�n no tiene m�s datos. �C�mo saber, a partir
>>
> de
>
>>ese puntero, y solamente ese puntero, cuanta memoria hay alojada en la
>>direcci�n a la que apunta?
>>
>
> No se puede saber.
>
>
>>Digo yo que tiene que haber alguna manera de saberlo, sin�, �c�mo funciona
>>free?
>>
>
> Con una tabla de informaci�n, que almacena cada proceso al final de la pila.
> Que no es estandar, ni donde se aloja, es totalmente dependiente del
> compilador usado.
>
> ---------------------------------
> jespejoYASABES@QUEHACERarrakis.es
> �Sistemas Operativos? �Vis�tala!
> http://www.arrakis.es/~jespejo
> ---------------------------------
>
>
>
Esto no es realmente cierto. Dependera basicamente de la libc. En linux
se suele usar para el tema free/malloc la implementacion dl-malloc (que
de echo es la mas usada en el mundo mundial :P). Y si. se puede saber el
tama�o de una chunk (chunk es un espacio en la heap tratado por
dl-malloc) mirando el campo size de la chunk, En el campo adeucuado de
la misma. (me explico muy mal, mirad la implementacion de la libc para
entenderlo mejor).
---
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
enum chunk_flags {
PREV_INUSE = 1 << 0,
IS_MMAPPED = 1 << 1
};
typedef struct malloc_chunk {
size_t prev_size;
size_t size;
struct malloc_chunk* fd;
struct malloc_chunk* bk;
} *mchunkptr;
#define chunk_offset (sizeof(size_t) * 2)
#define begin_chunk(mem) ((mchunkptr) ((mem) - chunk_offset))
#define SIZE_BITS (PREV_INUSE | IS_MMAPPED)
#define chunksize(p) ((p)->size & ~(SIZE_BITS))
int main() {
char *ptr;
char *ptr2;
mchunkptr ck;
mchunkptr ck2;
ptr=malloc(16);
ptr2=malloc(256);
ck=begin_chunk(ptr);
ck2=begin_chunk(ptr2);
printf("%i\n", (ck->size-9));
printf("%i\n", (ck2->size-9));
}
----
$ gcc pr.c -o pr
$ ./pr
16
256
$
Un saludo.
Ripe - www.7a69ezine.org
Technical Details
Message-ID:
<3BDF8091.2020101@7a69ezine.NO-ESPAM-HERE.org>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news.tele.dk!small.news.tele.dk!193.251.151.101!opentransit.net!newsfeed.comtenidos.com!newsfeeder.wanadoo.es!not-for-mailReferences:
<lnhip9.bq.ln@xxx.com> <87lmirknsk.fsf@meltdown.ion> <44ejp9.3f1.ln@xxx.com> <878zeqyp6r.fsf@relativistic.ion> <e8gnp9.ku.ln@xxx.com> <3bbf5519_4@news.arrakis.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,b3c8decf211f42e0 X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2001-10-30 20:46:10 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news.tele.dk!small.news.tele.dk!193.251.151.101!opentransit.net!newsfeed.comtenidos.com!newsfeeder.wanadoo.es!not-for-mail From: Ripe/7a69 <ripe@7a69ezine.NO-ESPAM-HERE.org> Newsgroups: es.comp.os.linux.programacion Subject: Re: Segmentation fault Date: Wed, 31 Oct 2001 05:39:45 +0100 Organization: Wanadoo Lines: 90 Message-ID: <3BDF8091.2020101@7a69ezine.NO-ESPAM-HERE.org> References: <lnhip9.bq.ln@xxx.com> <87lmirknsk.fsf@meltdown.ion> <44ejp9.3f1.ln@xxx.com> <878zeqyp6r.fsf@relativistic.ion> <e8gnp9.ku.ln@xxx.com> <3bbf5519_4@news.arrakis.es> NNTP-Posting-Host: 62-37-172-75.dialup.uni2.es Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Trace: news.wanadoo.es 1004503140 9895 62.37.172.75 (31 Oct 2001 04:39:00 GMT) X-Complaints-To: usenet@wanadoo.es NNTP-Posting-Date: Wed, 31 Oct 2001 04:39:00 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.5) Gecko/20011023 X-Accept-Language: en