2011-12-18 9 views
10

In generale, come per lo standard C è garantito che memset() con 0 azzererà i bit di riempimento in una struttura C?È garantito che memset azzererà i bit di riempimento in una struttura?

E a proposito di gcc?

Per esempio, qualcosa come:

struct MyStruct 
{ 
    unsigned char member1; 
    unsigned int member2; 
    char  member3; 
    unsigned char member4; 
    float  member5;  
}; 

struct MyStruct ms; 

memset(&ms, 0, sizeof(struct MyStruct)); 
+0

Puoi mostrarci un esempio di codice? – Mysticial

+0

codice di esempio aggiunto –

+2

Non capisco cosa possa far dubitare di questo. –

risposta

15

Forse la pena notare che memset non sa nulla della tua struct (o array, o primitiva, o qualsiasi pezzo di la memoria che ti capita di scatenare), quindi anche se volesse lasciare intatti i bit di padding, non saprebbe nemmeno dove si trovano.

11

Sì, memset scrive un valore a 32 bit in una regione contigua di memoria di una data lunghezza a partire all'indirizzo indicato. Nel tuo caso, memset scrive la regione con (valore 32 bit) 0.

Quindi, se si fa un memset lunghezza sizeof (your_struct), si dovrebbe andare bene:

memset(&ms, 0, sizeof(struct MyStruct)); 
8

Se è importante, probabilmente stai facendo qualcosa di non sicuro e non portatile.

Sì, la chiamata memset imposterà tutti i bit di riempimento (o byte) su 0 - ma non è garantito nella lingua che l'impostazione di un oggetto float su tutti i bit zero lo imposterà su 0.0. Lo stesso vale per i puntatori: non è garantito che all-bit-zero sia un puntatore nullo. (In entrambi i casi, è vero per la maggior parte delle implementazioni.)

Lo standard ISO C90 o C99 originale non garantiva nemmeno che all-bit-zero fosse una rappresentazione valida di 0 per i tipi interi; una delle correzioni tecniche post-C99 ha aggiunto una tale garanzia (solo per i tipi interi).

Per la portabilità, se si desidera che qualcosa sia zero, impostarlo in modo esplicito. È anche possibile sfruttare l'inizializzazione del valore zero per gli oggetti statici e per i membri omessi negli inizializzatori.

Un nitpick terminologico: i "padding bit" fanno parte della rappresentazione dei tipi interi (e di solito non ce ne sono). Il riempimento tra i membri della struttura è il riempimento byte.