I've never come across that before; but then again I always pass UDTs ByVal VarPtr() vs ByRef to CopyMemory; just a force of habit. But from your test. Not using ByVal, VB is obviously not passing the VarPtr of the UDT array member. One would need a debugger to see what address it is passing instead. But then one would have to be extremely curious to go that route too. Well, lesson learned for all hopefully.

As far as the array size goes. Though it didn't effect the test; it could have resulted in a crash if that last byte that attempted to be copied happened to be uninitialized or restricted memory.