Es simple, scanf espera que el primer parámetro de ESA llamada sea de tipo int* y tu le estás pasando un int. Así que SEGFAULT !
Poco a poco:
struct rectangulo *pp;
pp = (struct rectangulo *) malloc (sizeof (struct rectangulo));
Te sobra el casting, los punteros pueden ir de T* -> void* -> T* sin castings.
printf ("Introduce valor del ancho del rectangulo: ");
scanf ("%d", (pp->ancho));
printf ("\nIntroduce ahora el largo: ");
scanf ("%d", (pp->largo));
Como bien te dice el warning, ahí no quieres
pp->algo quieres un puntero a algo, es decir LA DIRECCIÓN de algo:
&pp->algo.
Y quita esos paréntesis, hacen más dificil de leer el código y simplemente demuestran que no leiste las normas de precedencia de los operadores :P Básicamente
-> liga muy fuerte, en este caso, mucho más que
,, así que los paréntesis sobran.
printf ("\nEl area del rectangulo es: %d", (pp->ancho) * (pp->largo));
Una vez más, quita los paréntesis,
-> liga mucho más fuerte que
*.
return 0;
Eso debería ser
return EXIT_SUCCESS;
- ferdy
-----------------------------
Se me olvidaba explicar el segfault. Básicamente scanf lo que hace es recibir un puntero donde guardar el dato que lee. Tu le estás pasando
pp->algo, ese valor es un entero que tiene un valor desconocido y aleatorio.
El segfault puede ser por dos razones:
1) Si sizeof(int) == sizeof(int*) entonces scanf tomará ese valor desconocido y aleatorio como un puntero e intentará grabar en una zona a la que SEGURO que no tienes acceso el valor leido, de ahí el segmentation fault.
2) Si sizeof(int) != sizeof(int*) entonces la extensión de signo producirá una dirección errónea y de ahí el segmentation fault.
- ferdy