It's not obvious to me why that couldn't be a conforming
implementation of va_copy.
Well, almost:
#define va_copy(dst, src) \
((void) memcpy((dst), (src), sizeof(va_list)))
because C99 says that, while va_copy is a macro, it acts as if it
were a void-valued function.
However, I wonder whether you really mean "can I implement it this
way?" In general, no: there is no guarantee that this will have
the desired effect.
Indeed. In particular, it will not work on implementations in
which "va_list" is a typedef alias for "char *", such as most
Intel-x86 systems.
There is always some way to define va_copy() that will work, but
the actual definition needs to change from one platform to the next.
The two most common definitions are the memcpy above, and the
even simpler:
#define va_copy(dst, src) ((void)((dst) = (src)))
Without knowing how the compiler implements va_list, va_start, etc.,
it is impossible to tell which of these two common definitions will
work (or whether a different, uncommon, definition is required).