El compilador, ademas de revisar que la sintaxis este bien, genera el codigo que se ejecutara posteriormente. Para el caso particular de la indexacion del arreglo, es un desplazamiento desde el comienzo del mismo unido al valor del indice. En sencillo, el compilador generara una suma: direccion de comienzo + desplazamiento. La suma se calcula en tiempo de ejecucion.
En tiempo de ejecucion, mucho despues de que el compilador actuo', la direccion de memoria resultante de la suma de antes dicha podria ser mas alla o mas aca de los limites del arreglo mismo.
Este es el primer problema que te puedes enfrentar, el siguiente es que las distintas arquitecturas tienen distintas exigencias, por ejemplo, que los enteros tienen que estar en direcciones de memoria multiplos de 4 y aunque validamente podrias tener una direccion de memoria, esta no sea posible de desreferenciar por la restriccion antes dicha. Este es el bus error.
El problema es doble: Salirte de los limites del arreglo, y luego tener direccion de memoria con mal alineamiento.
En general los compiladores no tienen ninguna logica para "ejecutar" el programa para poder detectar si este problema se va a producir en tiempo de ejecucion.
Sin embargo, para el problema de salirse de los limites del arreglo existen productos comerciales que realizan chequeos estaticos y podrian advertirte el problema. En general, los compiladores no hacen tales chequeos.
Cuando marcas lo ya visitado con el numero 0x58 estas usando el numero 88 para marcar. Esto podria marcar varias posiciones antes que pueda aparecer el 88. Cuando este aparece finalmente, tu logica hara que la condicion sea cierta para todas las posiciones que has marcado, y haras entonces que el contador crezca tanto como marcas haya.
- Que valor retorna la funcion positivo si el valor que recibe como parametro es efectivamente positivo? - Sugiero que las funciones positivo y negativo retornen 1 o 0. - Sugiero que no hagas ningun printf al interior de esas funciones, sino que sea el main el que lo haga basado en el valor que esas funciones retornen.
Se puede hacer recursivamente, en esa función, llamemosla f, suma 0 cuando sea una hoja, suma todo el resto recursivamente, retorna el valor de la suma y haz una función que llame a f y le reste el valor que está en la raíz.
Una posibilidad de solucion, alternativa a lo que ya se ha dicho, es tomar el numero de la segunda columna para iterar, y hacer unroll del primer ciclo, asi: