Article View: es.comp.os.linux.programacion
Article #6194Re: (Grandes) dudas sobre el funcionamiento de malloc() y realloc()
From: Fernando Arbeiza
Date: Thu, 17 Jul 2003 10:25
Date: Thu, 17 Jul 2003 10:25
109 lines
3864 bytes
3864 bytes
Hola:
A ver si te puedo aclarar algo...
On 17 Jul 2003 11:22:47 +0200, Han Solo <hsolo@escomposlinux.org> wrote:
> #include <stdio.h>
> #include <stdlib.h>
>
> #define ELEM 3
>
> float *p,*q;
> int i;
>
> main(){
Una cosita, C99 ya no permite el int impl�cito, as� que mejor definirlo
como:
int main(void) {
> p=(float *)malloc(ELEM*sizeof(float));
El cast es innecesario y puede esconder un comportamiento indefinido si
no se incluye stdlib.h. Adem�s, en el sizeof, mejor utilizar p, por si
cambia su tipo. Y, sobre todo, comprobar el valor que devuelve malloc;
es decir...
p = malloc(ELEM * sizeof (*p));
if (NULL == p) {
/* ... */
exit(EXIT_FAILURE);
}
> p[3]=266.6; /* �no deber�a dar un segfault? */
No tiene por qu� haber una violaci�n de segmento si p[3] pertenece a los
recursos que tienes asignados.
> while (*p!='\0'){
No has asignado a ninguna posici�n el valor '/0' (que adem�s es un
entero, no un float). Luego esta condici�n no tiene sentido. Ser�a algo
as�:
size_t i;
/* ... */
for (i = 0; i < NUM; i++) {
printf("VValor %f\n", *(p + i));
}
> *p++;
As� est�s aumentando en uno el valor de p y luego accediendo a la
posici�n de memoria. Es decir:
p = p + 1;
*p;
El acceso es in�til, pues no haces nada con �l. Y aumentando el valor de
p, pierdes el valor del puntero inicial; lo que es muy peligroso si
utilizas despu�s free o realloc.
> *p=0; /* �es realmente necesario poner a 0 este puntero? */
Para nada; �para qu� quieres que p[0] == 0.0?
> p=(float *)realloc(p, ELEM*4*sizeof(float));
Como te dije con malloc, no se debe convertir la salida. Adem�s, no
puedes utilizar el valor de p, pues no es puntero reservado con malloc
(lo has modificado); luego est�s invocando un comportamiento indefinido
(puede pasar cualquier cosa). Tambi�n hay que comprobar la salida,
puedes usarlo as�:
{
float *p_tmp;
p_tmp = realloc(p, 4 * ELEM * sizeof(*p));
if (NULL == p_tmp) {
/* ... */
exit(EXIT_FAILURE);
}
p = p_tmp;
}
> *p=0;
Vuelves a tener p[0] == 0.0; �para qu�?
> printf ("Aqu� se queda\n");
> while (*p!='\0'){
> printf("Valor de p (segundo) %f\n",*p);
> *p++;
> }
De nuevo, los valores no puede recorrerse as�. Adem�s, has igualado
*p == 0.0; as� que no recorrer� ning�n valor ( 0.0 == (double)'\0' )
Por cierto, he redirigido el art�culo a es.comp.lenguajes.c que all�
tambi�n te pueden ayudar.
Un saludo.
--
Fernando Arbeiza <URL: mailto:arbeizaf@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Technical Details
Message-ID:
<slrnbhcuc5.j6k.arbeizaf@jupiter.olimpo.homelinux.org>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!headwall.stanford.edu!fu-berlin.de!uni-berlin.de!81-203-248-186.user.ono.COM!not-for-mailReferences:
<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-17 03:30:32 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!headwall.stanford.edu!fu-berlin.de!uni-berlin.de!81-203-248-186.user.ono.COM!not-for-mail From: Fernando Arbeiza <arbeizaf@ono.com> Newsgroups: es.comp.os.linux.programacion Subject: Re: (Grandes) dudas sobre el funcionamiento de malloc() y realloc() Followup-To: es.comp.lenguajes.c Date: Thu, 17 Jul 2003 12:25:09 +0200 Lines: 109 Message-ID: <slrnbhcuc5.j6k.arbeizaf@jupiter.olimpo.homelinux.org> References: <86r84po6c8.fsf@pc147.ietcc.csic.es> NNTP-Posting-Host: 81-203-248-186.user.ono.com (81.203.248.186) Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de 1058437831 11879353 81.203.248.186 (16 [148301]) X-Orig-Path: jupiter.olimpo.homelinux.org!news User-Agent: slrn/0.9.7.4 (Linux)