The biggest problem: You are returning a pointer to the temp array that allocated on the stack. Once you return from your function, that array goes out of existence and it is pure luck if the calling function can see anything in that array.
Solution: Allocate the result array by the caller and pass a pointer to that array as parameter to your function:
char diff[255];
...
Sub (res, num1, num2);
There are a couple of things that you have solved a little clumsy. Checking for the length of both arguments is basically useless, because any of them might contain leading zeros.
I would handle the sign of the arguments and the result in a separate variable and that will save you the recursive call to your function.