🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#6194
From: Fernando Arbeiza
Date: Thu, 17 Jul 2003 10:25
109 lines
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-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-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)