So, you're copying indeterminate amounts of data around the place in the original, trampling outside the bounds of the arrays. A lot depends on how the arrays are laid out by the compiler. It looks like you're (un)fortunate that target3 is laid out at an address lower than source, so incrementing target often enough gets to end before you overwrite something critical and crash.

Email codedump link for Unexplainable side effects of a function on other unrelated ones in C