У своїх програмах на C мені часто потрібен спосіб скласти рядкове представлення моїх ADT. Навіть якщо мені не потрібно надрукувати рядок на екрані будь-яким способом, дуже охайно мати такий метод для налагодження. Тож ця функція часто з’являється.
char * mytype_to_string( const mytype_t *t );
Я фактично розумію, що у мене є (принаймні) три варіанти тут для обробки пам'яті для повернення рядка.
Альтернатива 1: Збереження рядка, що повертається, у статичному масиві символів у функції. Мені не потрібно багато роздумів, за винятком того, що рядок перезаписується при кожному дзвінку. Що може бути проблемою в деяких випадках.
Альтернатива 2: Виділіть рядок на купі з malloc всередині функції. Дійсно акуратний, оскільки мені тоді не потрібно буде думати про розмір буфера або перезапис. Однак я маю пам'ятати, щоб звільнити рядок (), коли це зроблено, і тоді мені також потрібно призначити тимчасову змінну, яку я можу звільнити. і тоді розподіл купи дійсно набагато повільніше, ніж розподіл стека, тому будьте вузьким місцем, якщо це повториться в циклі.
Альтернатива 3: Перейдіть у вказівник до буфера та дозвольте абоненту виділити цей буфер. Подібно до:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Це приносить більше зусиль абоненту. Я також зауважую, що ця альтернатива дає мені інший варіант щодо порядку аргументів. Який аргумент я повинен мати перший і останній? (насправді шість можливостей)
Отже, що мені слід віддати перевагу? Будь-чому? Чи є якийсь неписаний стандарт серед розробників C?
sysctlbyname
в OS X і iOS