W moich programach C często potrzebuję sposobu, aby utworzyć ciąg reprezentujący moje ADT. Nawet jeśli nie muszę w żaden sposób drukować łańcucha na ekranie, fajnie jest mieć taką metodę debugowania. Tak więc często pojawia się tego rodzaju funkcja.
char * mytype_to_string( const mytype_t *t );
W rzeczywistości zdaję sobie sprawę, że mam (przynajmniej) trzy opcje obsługi pamięci dla ciągu do zwrócenia.
Alternatywa 1: Przechowywanie łańcucha zwrotnego w statycznej tablicy znaków w funkcji. Nie potrzebuję dużo myślenia, poza tym, że ciąg jest nadpisywany przy każdym wywołaniu. Co może być problemem w niektórych przypadkach.
Alternatywa 2: Przydziel ciąg na stercie z malloc wewnątrz funkcji. Naprawdę fajnie, bo wtedy nie będę musiał myśleć o wielkości bufora ani o nadpisywaniu. Jednak muszę pamiętać, aby po zakończeniu wykonać polecenie free (), a następnie muszę także przypisać zmienną tymczasową, którą mogę zwolnić. a następnie przydzielanie sterty jest naprawdę znacznie wolniejsze niż przydzielanie stosu, dlatego bądź wąskim gardłem, jeśli powtarza się to w pętli.
Alternatywa 3: Przekaż wskaźnik do bufora i pozwól programowi wywołującemu przydzielić ten bufor. Lubić:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Daje to więcej wysiłku dzwoniącemu. Zauważam również, że ta alternatywa daje mi inną opcję w kolejności argumentów. Który argument powinienem mieć pierwszy i ostatni? (właściwie sześć możliwości)
Które więc powinienem preferować? Dlaczego? Czy istnieje jakiś niepisany standard wśród programistów C?
sysctlbyname
w OS X i iOS