Duda de C: Punteros de estructuras

Hola. Tengo un problema con el siguiente código:

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    int a;
}
Estructura;

void imprimir(Estructura);

int main ()
{
    Estructura *e;
   
    e->a = 10;
   
    imprimir(*e);
   
    system("pause");
    return 0;   
}

void imprimir(Estructura e)
{
    printf("%d\n\n", e.a);
}



Y es que la ejecución peta en la llamada a imprimir, ¿porqué?. Se que podría haber declarado la variable e como un 'valor absoluto' en vez de un puntero (o podría haber cambiado el parametro de imprimir por un puntero). Pero lo que quiero saber es porqué peta.

Saludos y gracias.
Hola:
El problema es que cuando declaras un puntero hay que reservar memoria: en c++ con new(), en c, como es el caso, con malloc.

El programa realmente peta en la asignación e->a = 10; al no estar reservada la memoria. ya que lo declarado como e es un puntero y no es el contenedor.

Si justo después de la declaración del pointer a la estructura le pones la reserva de memoria:

e=malloc(sizeof(Estructura));

ya tira.


el programa retocado queda:

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    int a;
}
Estructura;

void imprimir(Estructura);

int main ()
{
    Estructura *e = NULL;
   
    e=malloc(sizeof(Estructura));
   
    e->a = 10;
   
    imprimir(*e);
   
    return 0;   
}

void imprimir(Estructura e)
{
    printf("%d\n\n", e.a);
}


edito el mensaje para indicar que el programilla, a pesar de ser corto, tiene un grave problema: no se libera la memoria reservada. faltaría al final hacer el delete de puntero.
salu2
peqVic, muchas gracias por tu respuesta :). Efectivamente, ese era el problema...

Por cierto, creía que en las llamadas a malloc había que hacer un casting indicando el tipo del puntero, vamos, esto:

e = (Estructura*) malloc(sizeof(Estructura));


Siempre lo he hecho así, pero parece que no hace falta...

Saludos.
2 respuestas