Die Speicherverwaltung von dynamischen Arrays entspricht der von Strings, welche ja bekanntermaßen nicht (ohne Sharemem) übergeben werden dürfen.
Programm und
DLL allozieren getrennte Speicherbereiche für die Arrays (und verwalten deren Freigabe) und Du gibst in Deinem Beispiel nur die Zeiger dafür hin und her.
Sauber wäre es einen Zeiger auf das erste Element, sowie die Größe des Arrays zu übergeben und in der
DLL die Daten an diese Zieladresse zu schreiben.