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);
}