Would still suggest you put from printf's in there to try and determine which function is causing the failure. Just add something like this to the start of each of function.
Have had a quick look through the code. I see you do some scanf's and strcpy's. Their bounds checking is dogdy, are you sure you test data doesn't exceed the array bounds?
fprintf(stderr, "Starting function <insertfunctionnamehere>\n");
Be careful here too:
The unit_name variable is read from an external source and is therefore unrealiable. If the unit_name does not exist within your array (remember it's a case sensative search too), the low variable will eventually exceed the bounds for the units variable, and you'll crash&burn.
while(strcmp(units[low]->name, unit_name) !=0)