В C функции могут возвращать указатели в память, что эта функция динамически распределена и требует вызова кода для ее освобождения. Также часто требуется, чтобы вызывающий код поставляет буфер ко второй функции, которая затем устанавливает содержимое этого буфера. Например:Возвращает указатель на динамически распределенную структуру vs. требует выделенной памяти от вызывающей функции?
struct mystruct {
int a;
char *b;
};
struct mystruct *get_a_struct(int a, char*b)
{
struct mystruct *m = malloc(sizeof(struct mystruct));
m->a = a;
m->b = b;
return m;
}
int init_a_struct(int a, char*b, struct mystruct *s)
{
int success = 0;
if (a < 10) {
success = 1;
s->a = a;
s->b = b;
}
return success;
}
Возможно ли такое или иное использование? Я могу думать о аргументах для обоих: для метода get_a_struct код вызова упрощается, поскольку ему нужно только free() возвращенная структура; для метода init_a_struct существует очень низкая вероятность того, что вызывающий код не будет free() динамически распределенной памяти, поскольку сам вызывающий код, вероятно, выделил его.
Вы не можете бесплатно() структурировать, выделенную .dll. (По крайней мере, я не думаю, что вы можете.) Итак, если вы возитесь с dll, будьте осторожны. – Jiminion
init_a_struct может быть гораздо более эффективным, так как структура может быть повторно использована. –
@Jim Затем вы получите .dll функцию, которая снова освобождает данную структуру. – glglgl