Mira, puedes postear así que es mejor: Usa [ CODE ] y [/ CODE ] para encerrar código y poder usar tabuladores.
Por cierto, estás usando C antiguo para declarar las funciones. Te corrigo el código para hacerlo "moderno"
free_ivector
Código:
void free_ivector(int * v, int nl, int nh)
{
free((char*) (v+nl));
}
ivector
Código:
int * ivector(int nl,int nh)
{
int * v;
v=(int *) malloc((unsigned)(nh-nl+1)*sizeof(int));
if (!v) nrerror("allocation failure in ivector()");
return v-nl;
}
Bueno, realmente en esas funciones no se que haces. Lo primero, pides dos números, nhigh y nlow. La función que crea el vector hace un vector del tamaño (nh-nl+1), luego misteriosamente en vez de devolver (v) devuelves (v-nl), tal que:
Llamamos con (2,6)
Crea vector de tamaño 6-2+1=3
| | | |x|x|x| | |
^ ^
| |___v
|__________direccion devuelta
Y devuelves la posición dos lugares anterior, para que luego vuelva a la posición normal el puntero al llamar a free, extraño pero bien.
Después, otra cosa, el liberador pide el parámtro "nh", pero no le usa. Por otra parte, no sé para que conviertes la dirección resultante en (char *)...
Por último, en malloc haces casting a "unsigned", a pelo, lo cual ahora es incorrecto...
Otra cosa más... La manera que compruebas si el vector ha sido creado correctamente es con if(!v). Eso sólo funciona si NULL está definido como 0, pero... ¿Y si no lo está? Debes comparar con NULL que para eso existe, aunque en muchos casos sea 0.
Todas éstas corecciones están basadas en que estás usando C antiguo, no sé por qué. Pasa a C moderno todo el código primero y luego empieza con las correciones... En teoría esas dos funciones son correctas.