В моих программах на C мне часто нужен способ сделать строковое представление моих ADT. Даже если мне не нужно выводить строку на экран каким-либо образом, очень неплохо иметь такой метод для отладки. Так что такая функция часто появляется.
char * mytype_to_string( const mytype_t *t );
На самом деле я понимаю, что у меня есть (по крайней мере) три варианта обработки памяти для возвращаемой строки.
Альтернатива 1: сохранение возвращаемой строки в массиве статических символов в функции. Мне не нужно много думать, за исключением того, что строка перезаписывается при каждом вызове. Что может быть проблемой в некоторых случаях.
Альтернатива 2: выделите строку в куче с помощью malloc внутри функции. Действительно аккуратный, так как мне не нужно думать о размере буфера или перезаписи. Тем не менее, я должен помнить free () строку после завершения, а затем мне также нужно назначить временную переменную, чтобы я мог освободить. и тогда выделение кучи действительно намного медленнее, чем выделение стека, поэтому будьте узким местом, если это повторяется в цикле.
Альтернатива 3: передать указатель на буфер и позволить вызывающей стороне выделить этот буфер. Подобно:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Это приносит больше усилий звонящему. Я также заметил, что эта альтернатива дает мне другой вариант порядка аргументов. Какой аргумент я должен иметь первым и последним? (на самом деле шесть возможностей)
Итак, что я должен предпочесть? Есть почему? Есть ли какой-то неписаный стандарт среди разработчиков C?
sysctlbyname
в OS X и iOS