У меня есть функция, которая задает два целых числа и возвращает строку. Сейчас у меня есть это:Правильный способ вернуть строку из функции
char* myfunc(int a, int b, int* len)
{
int retLen = ...
char* ret = malloc(retLen + 1);
if (len != NULL)
{
*len = retLen;
}
return ret;
}
Однако, большинство функций в библиотеке C, как правило, сделать что-то подобное:
int myfunc(char* ret, int a, int b)
{
...
return retLen;
}
Вы тогда, как ожидается, выделить память для функции для заполнения. Это позволяет вам немного походить на выбор, где выделена строка.
В этом случае, хотя в функции требуется определенная математика для получения длины, и нет причин иметь буфер любого размера, кроме необходимого. Верхний предел размера буфера отсутствует (хотя это не разумно).
Что считается хорошей практикой при возвращении строки, длина которой динамически найдена с учетом входных данных?
Конечно, с этим рисунком вы передали бы длину вместе с указателем. Это может быть даже параметр ввода/вывода (передан как 'size_t *'). – cHao
Да, действительно, я отредактировал подпись. – clyfe
Очень хороший ответ, который очень помогает, поэтому спасибо. Пара вопросов: почему для этой функции предпочтительнее функция 'size_t myfunc (char * output, size_t given, ...)', которая эффективно возвращает 'need_or_resulted' для пользователя, чтобы сравнить его собственное значение для успеха? Кроме того, почему это предпочтительнее второй функции, такой как 'myfuncLength', которая выполняет необходимые вычисления длины? – Matt