Sto scrivendo un'API C per recuperare i dati da un dispositivo hardware. I dati verranno restituiti come una stringa con circa 30 byte di testo per articolo. Il problema è che ci può essere un numero qualsiasi di elementi. Potrebbero solo 10 o potrebbero essere 10.000. Quindi i dati restituiti potrebbero variare da 10 x 30 = 300 a 10.000 x 30 = 300.000 byte.
Inizialmente, la funzione per ottenere i dati era così:
int get_devicelist(char* devicelist);
Quindi l'onere è sul chiamante per sapere cosa stanno facendo e specificare un buffer abbastanza grande. Il problema è che il software che utilizza l'API può essere utilizzato in molte applicazioni degli utenti finali, pertanto il programmatore non ha conoscenze specifiche dell'utente finale quando scrive codice per utilizzare l'API. L'unica opzione è quella di specificare un buffer (o allocare su heap) abbastanza grande da contenere la maggiore quantità possibile di dati restituiti.
Quindi per questo motivo sto pensando di cambiare l'API come qui:
char* get_devicelist();
void free_devicelist(char* devlist);
ad es. nell'implementazione:
char* get_devicelist() {
size_t n = get_devices_size();
char* devlist = malloc(n * 30);
if(devlist)
/* populate devlist */
return devlist;
}
void free_devicelist(char* devlist) {
free(devlist);
}
O semplicemente informo gli utenti di chiamare gratuitamente su devlist quando non sono più necessari?
Vorrei cambiare il codice API per ottenere il numero di dispositivi e quindi allocare una quantità appropriata di memoria per l'inizializzatore. L'unico svantaggio è che all'utente viene richiesto di chiamare free_devicelist per liberare la memoria allocata.
La seconda API è migliore? C'è un modo alternativo?