С подписью void callback_decl (char* data, size_t size, void* ret_val)
вызывающая сторона несет полную ответственность за предоставление выделенной памяти. Вызванный обратный вызов не может выделить внутреннюю память.
Если вы задумаетесь на мгновение, это на самом деле предпочтительнее, так как вызывающий гораздо лучше знает, где должна быть выделена память (куча или стек ) и имеет полный контроль над всем временем жизни строки.
Обычно этот шаблон комбинируется со специальным значением для ret_val
, которое указывает, что предоставленный буфер слишком мал , поэтому вызывающий может выполнить обратный вызов снова, но с большим буфером.