you may not use a local variable for sending data, because sending data will still happen after return from hnd_fcmData_U1 function. At that point, local variables are not in scope anymore and so the contents is undefined.
You could allocate a buffer dynamically (using a global pointer value) and when you get the ADL_FCM_EVENT_MEM_RELEASE you should release the memory. This event tells you that transmission of the buffer contents has been completed and the buffer is no longer required, so that you may release it.
adl_fcmSendData() does a local copy of your buffer, so you can give it a local variable.
adl_fcmSendDataExt() expects a preformatted buffer allocated with adl_memGet(), does not recopy it, and does adl_memRelease() it when sent. When releasing, it sends the MEM_RELEASE event to notify you; however, it’s already released, so you must not adl_memRelease() it yourself.
adl_fcmSendData() is just a wrapper around adl_fcmSendDataExt() which creates the preformatted buffer and fills it with your data. It causes a MEM_RELEASED event when that internal buffer is released, but that’s none of your business, you chouls ignore that event.