Хорошо, если мы посмотрим на различные apis, тогда мы получим представление. Например, strdup()
, где мы передаем const char *s
в качестве аргумента, strdup()
берет на себя ответственность за выделение памяти. С другой стороны, вы также найдете примеры, где функции обычно не несут ответственность за выделение буфера i.e fgets()
(есть еще много). Доступны также функции, которые позволяют использовать, например, getline()
. От человека странице getline()
:
If *lineptr is NULL, then getline() will allocate a buffer for storing the line
,which should be freed by the user program. (In this case, the value in *n is
ignored.)
Alternatively, before calling getline(), *lineptr can contain a pointer to a
malloc(3)-allocated buffer *n bytes in size.
Таким образом, все подходы справедливы. Одна вещь, которую вы должны поддерживать: документация. Если нужно правильно его реализовать (не забудьте подумать о различных последствиях), и пусть пользователь знает, что делает эта конкретная функция. Это ваша вина, если вы не предоставляете документацию и ответственность пользователей за то, чтобы знать, как работает эта конкретная функция.
Я не понимаю, что происходит. Кто вызывает 'malloc()'? Вы? Пользователь? Почему вы хотите освободить то, что пользователь, по-видимому, хочет потреблять позже? –
"эта функция будет делать вызов для malloc() или связанных и устанавливать s вместо этого там?" - пахнет недоразумением. Установка указателя * внутри * функция ** не будет изменять ее, и это означает, что ваша * функция будет утечка памяти. Вам даже не нужно ничего malloc, если 's' является действительным при передаче вашей функции (как это определенно должно быть). –
Wel .. обычно. Это зависит от того, будет ли функция принимать участие в переданной строке, например. путем очередности указателя на внутренний поток). Тем не менее, вы правы - указатель передается по значению, и библиотека не может магически изменить его. –