Funzioni che restituiscono stringhe, buon stile?

9

Nei miei programmi C spesso ho 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, è utile avere un metodo simile per il debug. Quindi questo tipo di funzione viene 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 stringa da restituire.

Alternativa 1: memorizzazione della stringa di ritorno in un array di caratteri statici nella funzione. Non ho bisogno di molto pensare, tranne che la stringa viene sovrascritta ad ogni chiamata. Quale potrebbe essere un problema in alcune occasioni.

Alternativa 2: Assegna la stringa sull'heap con malloc all'interno della funzione. Veramente pulito poiché non avrò bisogno di pensare alle dimensioni di un buffer o alla sovrascrittura. Tuttavia, devo ricordare di liberare () la stringa quando è terminata, e quindi devo anche assegnare a una variabile temporanea in modo tale che io possa liberare. e quindi l'allocazione dell'heap è molto più lenta dell'assegnazione dello stack, quindi può essere un collo di bottiglia se questo viene ripetuto in un ciclo.

Alternativa 3: passa il puntatore a un buffer e lascia che il chiamante assegni quel buffer. Come:

char * mytype_to_string( const mytype_t *mt, char *buf, size_t buflen ); 

Questo porta più impegno al chiamante. Inoltre noto che questa alternativa mi offre un'altra opzione sull'ordine degli argomenti. Quale argomento dovrei avere prima e l'ultima? (in realtà sei possibilità)

Quindi, quale preferisco? Qual è il motivo? C'è qualche tipo di standard non scritto tra gli sviluppatori di C?

    
posta Øystein Schønning-Johansen 08.02.2015 - 01:07
fonte

1 risposta

9

I metodi che ho visto di più sono 2 e 3.

Il buffer fornito dall'utente è in realtà abbastanza semplice da utilizzare:

char[128] buffer;
mytype_to_string(mt, buffer, 128);

Sebbene la maggior parte delle implementazioni restituisca la quantità di buffer utilizzata.

L'opzione 2 sarà più lenta ed è pericolosa quando si utilizzano librerie collegate dinamicamente dove possono utilizzare diversi runtime (e diversi heap). Quindi non è possibile liberare ciò che è stato malloced in un'altra libreria. Ciò richiede quindi una funzione free_string(char*) per gestirla.

    
risposta data 08.02.2015 - 01:33
fonte

Leggi altre domande sui tag