Error con punteros y referencia (Segmentation fault (core dumped))

Error con punteros y referencia (Segmentation fault (core dumped))

de Luis Diego Di Martino Bolentini -
Número de respuestas: 1

Juan,

       El otro día me acuerdo te comenté que me había dado un error un ejemplo y nos habías pedido que te comentáramos estos para poder analizarlos. El error me salio en el ejercicio 1 del modulo 2.

El error que obtengo es:

Segmentation fault (core dumped)

Y lo obtengo cuando hago lo siguiente:

int a;
int b;
int *pa;
int *pb;
a = 5;
b = 8;
*pa = &a;
*pb = &b;

El error no aparece si hago el cambio en la asignación de pa y pb:

int a;
int b;
int *pa;
int *pb;
a = 5;
b = 8;
pa = &a;
pb = &b;

Entiendo que el error se da porque pa y pb son los punteros y *pa, *pb serían los valores apuntados por esos punteros (o sea, los valores a y b). Creo que en el primer caso le estoy diciendo que a lo que apunta pa (o sea, el int a) le asigne la dirección de memoria donde anteriormente guarde la variable a y ahí da error porque la dirección de memoria no es un int. Esto se corrige en el segundo caso.

En cualquier caso podemos revisarlo la próxima clase si te parece,

Saludos,

Luis

 

En respuesta a Luis Diego Di Martino Bolentini

Re: Error con punteros y referencia (Segmentation fault (core dumped))

de Juan Cardelino -

Cada vez más estoy convencido de que esta forma de proceder es la correcta. Es decir incentivar a que pregunten aunque lo solucionen. La explicación que proponés no es correcta. Respondo en dos partes, primero analizando tu respuesta y luego proponiendo una forma de encontrar el error.

1) Crítica a tu razonamiento: La dirección de memoria si es un int, o un tipo convertible. En cualquier caso no debería darte un error, como mucho un warning y menos un segmentation fault.

Es importante conocer que tipo de errores están correlacionados con cierto tipo de problemas. Nunca una conversion de tipos te va a dar un segmentation fault.

De todas formas, estas cosas es mejor no sólo razonarlas en el papel, sino experimentar. Tienen que tomarse esto como si fuera física. Uno plantea una proposición y la valida experimentalmente de forma rigurosa. Como prueba de esto, te propongo que agarres una variable común (no puntero) de diferentes tipos y le metas una dirección de memoria adentro. Ejemplo:

int c=&a; 

Luego varialo con el tipo de c. por ejemplo float c, char c, etc. Si tu razonamiento fuera válido, eso debería dar un problema.

2) En el fondo, en mi análisis de tu error, lo que hice fue diseccionar la "línea problemática" (*) y ver una de sus posibles partes. De eso concluyo que no fue problema de la parte de tipos, porque sin puntero anda. Ergo, el problema es el puntero. Pensá un poco mejor que significa *pa= algo y cuando puede fallar.

(*) Cuando hablo de la línea problemática, estoy validando un supuesto que hiciste, que el problema está en esa línea. Eso también necesita más rigor, deberías demostrar con un debugger que el problema está en esa línea. Muchas veces el programa se cae en lugares distintos a los cuales generan el problema. Es importante no dar nada por sentado y revisar todo.

Recomiendo particularmete usar el debugger, dejar que muera el programa y analizar los valores de las variables en ese momento. Eso te va a dar una pista.

La tentación en estos casos es adivinar que pasó, pero en realidad hay que aplicar un proceso sistemático de análisis, en parte de eso se trata el curso. Esto es crítico porque en general ningún error es lo que parece a simple vista.

 

Saludos,

            Juan