Facebook Google+


Error con punteros dobles y memoria dinámica en lenguaje C
#1
Hola, ¿cómo están? -
Estaba buscando algún ej. con array de 2 dimensiones con memoria dinámica y encontré este programa en el manual que estoy leyendo, me pareció a simple vista que estaba bien lo estudie un poco lo corrí y todo bien, pero o sorpresa cundo pongo más renglones que columnas me dan el error Violación de segmento (`core' generado), con lo poco que conozco del tema intente solucionarlo por mí mismo pero no lo logro, espero me puedan ayudar, dejo aclarado que si bien desconozco cómo se hace exactamente el bucle para liberar la memoria tengo claro que debo hacerlo con free antes del return. -
Código:
#include <stdio.h>
#include <stdlib.h>

int main( void ){
    int f,c,i,j;
    int **pm;

    printf("\n Ingresa el numero de renglones...: ");
    scanf("%d",&f);
    printf("\n Ingresa el numero de columnas....: ");
    scanf("%d",&c);
    pm=(int **)malloc(sizeof(int *)*f);

    for (j=0;j<c;j++)
        pm[j]=(int*)malloc(sizeof(int)*c);
    for (i=0;i<f;i++)
        for (j=0;j<c;j++)
            pm[i][j]=i*j+1;

    putchar('\n');
    for (i=0;i<f;i++){
        for (j=0;j<c;j++)
            printf("%d\t",*(*(pm +i)+j));
            putchar('\n');
    }

    return 0;
}
Saludos y desde ya muchas gracias.-
[Imagen: ip.gif] En línea
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
 
Reply
#2
Tu fallo está aquí:
Código:
// ...
    scanf("%d",&c);
    pm=(int **)malloc(sizeof(int *)*f);

    for (j=0;j<c;j++)  //  <--- *** FALLO ***
        pm[j]=(int*)malloc(sizeof(int)*c);
    for (i=0;i<f;i++)
// ...
El límite del for es el número de filas (f) y no de columnas ©.

Para liberar memoria debes hacerlo al revés de como la has adquirido: liberas las filas y por último la tabla:
Código:
for(i=0; i<f; i++)
        free(pm[i]);
        
    free(pm);
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#3
Ok. funciona correctamente, igual adjunto una captura porque me llama la atención tantas hojas dedicada a memoria dinámico y tan sutil error, ¿estará hecho a propósito?

[Imagen: s2a0qu.png]

saludos y muchas gracias MAFUS. -
[Imagen: ip.gif] En línea
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
 
Reply
#4
Hola. -
Nuevamente dudas que tienen que ver con memoria dinámica, alguien me podría decir si ¿para liberar memoria en array de estructura debo hacer un bucle, o se hace como en una variable común ?. -
Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct{
    char nombre[30];
    char direccion[30];
    int edad;
}alumno;

int main( void ){
    alumno *b=NULL;
    int max,i;
    unsigned int ch=0;
    
    printf("\n Ingresa la cantidad de alunos.....:");
    scanf("%d", &max);    
    b = ( alumno * )malloc( sizeof(alumno)*max );
    for( i=0; i<max; i++){
        printf("\n Ingresa el nombre del alumnos [%d].....:", i+1);
        scanf( "%s", (b+i)->nombre );
        while((ch = getchar()) !='\n' && ch!=EOF);        
        printf("\n Ingresa la direccion del alumno [%d]...:", i+1);
        scanf( "%s", (b+i)->direccion );
        while((ch = getchar()) !='\n' && ch!=EOF);        
        printf("\n Ingresa la edad del alumno [%d]........:", i+1);
        scanf( "%d", &(b+i)->edad );
        printf( "\n ================================================\n" );
    }     

    for (i=0;i<max;i++){
        printf("%s\t%s\t%d\n",(*(b+i)).nombre,(*(b+i)).direccion,(*(b+i)).edad);
    }

    return 0;
}

Gracias nuevamente. -
[Imagen: ip.gif] En línea
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
 
Reply
#5
Debesaplicar free tal como hiciste en *alloc:
Si has hecho: p = malloc(n * sizeof(T))
Debes hacer: free(p);

Si has hecho: p = malloc(n * sizeof(T*));
-> bucle en i sobre n: p[n] = malloc(m * sizeof(T));

Debes hacer:
-> bucle en i sobre n: free(p[i]);
Y liberar el puntero principal: free(p);
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
Reply
#6
Hola, MAFUS.
Gracias, como siempre tan atento para ayudar a los demás, demore un poco porque no me quedaba claro el tema pero con tus Ejs. y algunas otras lecturas parece que estoy encaminado. -
Saludos.
[Imagen: ip.gif] En línea
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
 
Reply
  


Salto de foro:


Browsing: 1 invitado(s)