I have asked several friends for help. I have no idea what is going wrong with my program. It's a multifile program so I will just post the functions that are being used in my test. I'm not quite sure if I am allocating the memory properly but I assume I am because of the if statement. Well here is my code. By the way please correct me if you see any bad habits or wrong conventions. I take constructive criticism very well. Heck even harsh criticism.

Code:
int test_reduce(char * err_messages)
{
   Fraction inputs[REDUCE_COUNT] = REDUCE_INPUT;
   Fraction corrects[REDUCE_COUNT] = REDUCE_CORRECT;
   Fraction computed[REDUCE_COUNT] = {};
   Fraction in_fraction = {0,1}, correct = {0,1}, result;


   int i = 0, errors = 0;


   for(i = 0; i < REDUCE_COUNT; i++) {
      in_fraction = inputs[i];
      correct = corrects[i];
      result = in_fraction;
      reduce_fraction(&result);


      if (!equalFractions(result,correct)) {
	 if (!errors) {
	    strcat(err_messages,"\n\nReduce Errors:\n");
	    errors = 1; 
	 }
	 sprintf(err_messages,"%s(%d,%d)\nreceived (%d,%d), correct (%d,%d)\n\n",
		 err_messages,in_fraction.numer,in_fraction.denom,result.numer,
		 result.denom,correct.numer,correct.denom);
      }
   }
   return !errors;
}

int gcd(int a, int b)
{
   if (a == 0 && b == 0) 
   {
      printf("Illegal args to gcd: %d, %d\n",a,b);
      exit(1);
   }
   a = abs(a);
   b = abs(b);
   
   if (a == 0)
      return b;
   if (b == 0)
      return a;
   return gcd(b,a%b);
}

void reduce_fraction(Fraction *R)
{   
     int cmnDenom;
     Fraction *reduce;
     reduce = (Fraction*) malloc(sizeof(reduce));
     //reduce = (reduce*)malloc(sizeof(reduce));
     if(reduce != NULL)
     {
         printf( "R->numer: %d\nR->denom: %d\n\n", R->numer,R->denom);
     
         cmnDenom = gcd(R->numer,R->denom);
         reduce->numer = R->numer/cmnDenom;
         reduce->denom = R->denom/cmnDenom;


         *R = *reduce;
     }
     
     free(reduce);
}