Du übergibst der Funktion den Pointer "length", der auf einen uint16_t zeigt. In der Funktion greifst du aber so auf length zu, als wäre es ein uint16_t und kein Zeiger darauf.
Wenn du die Variable ansprechen willst, auf die der Zeiger p zeigt, musst du *p schreiben.
Also bei dir z.B. *length=100; um den Wert der Variable, auf die lenght zeigt, auf 100 zu setzen. Ist dir wirklich klar, was ein Zeiger ist?