Cuando una variable no es inicializada puede tener exactamente el valor que no esperas (o justo el que esperas). No es predecible. Es completamente posible que dentro de la casuística, tomando el caso que dices, por ejemplo, que no haya números validos, y por ello fin y pos nunca se inicializan, dentro de la "mala suerte", fin tiene un valor inicial 0 y pos tenga valor inicial 23042383, o aquel set de valores que hace que la logica que está a continuacion funcione de manera "extraña" o errática.
En otro asunto a mejorar, te sugiero usar algo que el compilador del lenguaje C provee GRATIS
y que parece que no es muy conocido:
Cada vez que usas un caracter literal, el compilador REEMPLAZA ese caracter literal por el equivalente numerico.
Entonces, dado esto, es mucho mas legible un programa que dice
if( variable >= '0' && variable <= '9' )
que aquel que dice
if( variable >= 48 && variable <= 57 )
(suponiendo que esos son los valores)
si los valores son los correctos ambas instrucciones son equivalentes, pero una de ellas es, en mi opinion, mas clara que la otra.
Una consecuencia directa de esto es que no es necesario saber o averiguar a que codigo corresponde cada caracter. De hecho, es posible que se cometan errores al usar esas constantes, si es que uno se las supiera (mal). Mucho mejor usar '0', '1', etc.
Respecto al & es que no deberia existir diferencia entre &arr y arr, cuando arr es el identificador de un arreglo, pero si lo habrá cuando se trate de un puntero al comienzo de un arreglo y entonces mejor usar el puntero al inicio representado por el identificador del arreglo siempre. De otra manera, un compilador habil te dirá que podria haber un conflicto en esa particular construccion. Esto resulta medio jeroglífico, supongo que requiere que yo lo relea y rescriba otra vez, pero lo dejaré para una proxima oportunidad.