You must use
"$@" instead of
exec ./mysh1 "$@"
That's the right way to expand all positional arguments as separated words.
When you use
$*, all positional arguments was concatenated in to one long string, with the first value of
IFS as separator, which default to a whitespace, you got
A B 2 C.
Now, because you use
$* without double quote (which can lead to security implications and make your script choked), the shell perform
split+glob on it. The long string you got above was split into four words,
Therefore, you actually passed four arguments to
mysh1 instead of three.