Quale è meglio: per la lunghezza del buffer valida?

1

Questa è una domanda di base. Ma, penso che capire questo sarebbe utile per giocare con i buffer in "C". Grazie.

Scenario

Solo uno snippet di esempio

char *test_buff = (char *) malloc(512); //allocate 512 bytes in heap memory.
bzero(test_buff, 512); //Reset buffer instead of Junk/garbage.
/* random code here to fill-in the buffer called "test_buff"...*/
...
/* Send data to another host/system [this doesn't matter though]
 * using buffer "test_buff".
 */
 sendto(sock_descriptor, test_buff /*buffer to send data*/, sizeof(*test_buff) ,...,...);  // option-1
/* OR */
 sendto(sock_descriptor, test_buff /*buffer to send data*/, 512 /* actual malloced size*/ ,...,...); // option-2

Domanda

  1. Quale dei due è il migliore [tra opzione-1 / opzione-2] per usare il buffer? Spero che l'opzione 1 abbia senso, dato che ha lunghezza / dimensione dei byte dati validi del buffer di invio o "test_buff" in questo caso.

Grazie per il tuo tempo e i tuoi input.

    
posta smaven 13.12.2013 - 05:31
fonte

2 risposte

4

sizeof(*test_buff) è calcolato al momento della compilazione e valuterà la dimensione di un singolo elemento di test_buff . Poiché test_buff è un buffer di char , quella dimensione dell'elemento è garantita come 1. Se devo scegliere tra le due opzioni che offri, solo l'opzione 2 ha un comportamento utile.

D'altra parte, se arriva il momento in cui devi cambiare la dimensione del tuo buffer, devi fare quel cambiamento in 3 (o 4 o 5) posti e devi cercare i luoghi dove il numero 512 è usato con un significato diverso. Per questo motivo, il mio modo preferito di scrivere il codice è simile a questo:

#define BUFFER_SIZE 512
char *test_buff = (char *) malloc(BUFFER_SIZE); //allocate 512 bytes in heap memory.
bzero(test_buff, BUFFER_SIZE); //Reset buffer instead of Junk/garbage.
/* random code here to fill-in the buffer called "test_buff"...*/
...
/* Send data to another host/system [this doesn't matter though]
 * using buffer "test_buff".
 */
 sendto(sock_descriptor, test_buff /*buffer to send data*/, BUFFER_SIZE /* actual malloced size*/ ,...,...); // option-2a

Se vuoi inviare solo la parte usata del buffer, devi tenere traccia di ciò in modo esplicito oppure, se il tuo buffer contiene solo una singola stringa, puoi utilizzare strlen(test_buff)+1 (+1 per garantire la percentuale di terminazione anche'%code%' viene trasmesso).

    
risposta data 13.12.2013 - 09:17
fonte
3

In quanto sizeof(*test_buff) sarà sizeof(char) , cioè 1 , andrei con 512 .

    
risposta data 13.12.2013 - 05:40
fonte

Leggi altre domande sui tag