Изменить адрес переменной, переданной как параметр функции void * - PullRequest
0 голосов
/ 03 августа 2020

У меня есть функция обратного вызова void string_cb(char* data, size_t size, void* str), которая использует прототип void callback_decl (char* data, size_t size, void* ret_val), где последний параметр является возвращаемым значением. Поскольку моему обратному вызову необходимо выделить память для строки с malloc(), мне нужно изменить адрес void* str на выделенный блок памяти. Можно ли присвоить str новый адрес без изменения прототипа обратного вызова?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

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

Если вы задумаетесь на мгновение, это на самом деле предпочтительнее, так как вызывающий гораздо лучше знает, где должна быть выделена память (куча или стек ) и имеет полный контроль над всем временем жизни строки.

Обычно этот шаблон комбинируется со специальным значением для ret_val, которое указывает, что предоставленный буфер слишком мал , поэтому вызывающий может выполнить обратный вызов снова, но с большим буфером.

1 голос
/ 03 августа 2020

Да, можно ... но не с вашим string_cb заявлением. Если вы хотите иметь возможность возвращать адрес только что выделенного массива, вам нужен char ** в качестве последнего параметра:

void slbin_handler_nstring(char* data, size_t data_size, void* ret_ptr) {
    char** ptr = (char **) ret_ptr;
    *ptr = malloc(data_size);
    if (!(*ptr)) return;
    memcpy(*ptr, data, data_size);
}

Если нужно вызывать таким образом:

char *ptr;
slbin_handler_nstring(data, data_size, &ptr) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...