Hello benni - your concept of copying vectors and not being able to scale negative values and so on is all nonsense, so the first thing you should do is throwing out all your copy_vectors.

Apart from that your code looks very wrong, for instance you are using local variables and then return them, but they cease to exist outside the function and thus all you return is garbage. I think the problem is not vector math, the problem is some fundamental misunderstanding of functions and pointers.

function whatever(VECTOR* a, VECTOR* b, VECTOR* c)
{
VECTOR result; // intermediate results
vec_set(result,b);
vec_sub(result,c);
vec_set(a,result);
// result is returned in a
}

Hope you get the idea...