Infinite scrolling

Error de principiante

La noche de ayer estaba revisando el código fuente de mi tesis. Y entre todos los recuerdos romaticones al respecto hubo uno que sobresalió. Pero este no tiene en nada absoluto de romantico. Fue un problema con un apuntador con el que batallé por más de una semana hasta darme cuenta que no era más que una estupidez que había cometido por mi falta de expeciencia en C y en apuntadores. Y es que en la universidad a uno le enseñan a temerle a los apuntadores. Antes de mostrarle todas las ventajas que estos tienen a uno le enseñan todas las cagadas que uno puede hacer con los apuntadores.

Por otro lado, uno empezaba a programar con C++ (en estos momentos creo que uno debería empezar con Haskell, Lisp o Scheme) donde uno se puede evitar muchas veces el uso de apuntadores, ya que con las referencias basta. Pero cuando toca meterle la mano a Apache, no hay C++ que valga, ahí si había que ensuciarse las manos. Aprender C y enfrentarse desnudo a los apuntadores y entonces es cuando la falta de experiencia hace su aparición.

El problema en cuestión sucedía en un procedimiento que recibía un arreglo (cuyo tamaño podía variar) este tenía que generar un duplicado de este arreglo y luego generar uno nuevo con tres elementos. El código era más o menos así:

int *tmp = (int*)malloc(sizeof array1);
int i;
for(i = 0; i < longArray1; i++){
    tmp[i] = array1[i];
}
int *clase = (int*)malloc(3 * sizeof int);

Fool of me. Creo que cualquiera que pase por acá y sepa un poco de C notará el error. Pero antes hablaré de las consecuencias. Cuando modificaba algún valor en clase, los valores de tmp se modificaban también. Mi primera suposición (correcta además) era que la dirección de memoria asignda a clase se encontraba dentro del rango que se debía asignar a tmp, dos posiciones adelante para ser exactos, pero confimar esto requirió un poco de esfuerzo. Tras mucho romperme la cabeza con este problemita me encontré con la solución.

Resulta que los arreglos en C no son más que apuntadores a la primera posición de este. cuando se hace sizeof array1 realmente estoy consultado el tamaño de un apuntador, que para efectos prácticos es el tamaño de la dirección de memoria de la variable, la cual realmente depende del computador y en mi caso correspondía a 2 enteros. A la hora de hacer el ciclo for, nadie se quejaba por que simplemente me estaba moviendo un apuntador adelante. Pero realmente mi arreglo tenía asignado un espacio en memoria para dos elementos. Cuando creaba el tercer arreglo obviamente tenía la dirección justamente despues del arreglo original :(.

Bueno, esa es la experiencia que más recuerdo de mi tesis, ojalá le sirva de algo a alguien, sino, igual disfruté describiendola :D.

1 comment:

  1. Mmmm .... yo no veo el error :(

    Porque si modifica clase tambien modifica tmp?

    Con el malloc() no les esta asigando diferentes espacios de memoria?

    Ahhhhhhhhhhhhhh claro, el primer sizeof, jejeje

    ReplyDelete