Nei miei programmi in C ho spesso bisogno di un modo per creare una rappresentazione in stringa dei miei ADT. Anche se non ho bisogno di stampare la stringa sullo schermo in alcun modo, è corretto avere tale metodo per il debug. Quindi questo tipo di funzione si presenta spesso.
char * mytype_to_string( const mytype_t *t );
In realtà mi rendo conto di avere (almeno) tre opzioni qui per gestire la memoria per la restituzione della stringa.
Alternativa 1: memorizzazione della stringa di ritorno in un array di caratteri statici nella funzione. Non ho bisogno di molte riflessioni, tranne per il fatto che la stringa viene sovrascritta ad ogni chiamata. Quale potrebbe essere un problema in alcune occasioni.
Alternativa 2: alloca la stringa sull'heap con malloc all'interno della funzione. Davvero pulito da quando non avrò più bisogno di pensare alle dimensioni di un buffer o alla sovrascrittura. Tuttavia, devo ricordare di liberare () la stringa una volta terminato, e quindi devo anche assegnare a una variabile temporanea tale da poter liberare. e quindi l'allocazione dell'heap è molto più lenta dell'allocazione dello stack, quindi sii un collo di bottiglia se questo viene ripetuto in un ciclo.
Alternativa 3: passare il puntatore a un buffer e consentire al chiamante di allocare quel buffer. Piace:
char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen );
Questo porta più impegno al chiamante. Noto anche che questa alternativa mi offre un'altra opzione sull'ordine degli argomenti. Quale argomento dovrei avere il primo e l'ultimo? (in realtà sei possibilità)
Quindi, quale dovrei preferire? Qualche perchè? Esiste una sorta di standard non scritto tra gli sviluppatori C?
sysctlbyname
in OS X e iOS