2011-12-18 7 views
10

En general, según el estándar C, ¿se garantiza que memset() con 0 pondrá a cero los bits de relleno en una estructura C?¿Se garantiza que memset pondrá a cero los bits de relleno en una estructura?

¿Qué pasa con gcc?

Por ejemplo, algo como:

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

¿Puede mostrarnos un ejemplo de código? – Mysticial

+0

código agregado muestra –

+2

No entiendo qué hace que tu duda sea esa. –

Respuesta

15

Tal vez la pena señalar que memset no se sabe nada acerca de su estructura (o matriz, o primitivo, o cualquier parte de memoria en la que lo sueltas), incluso si quisiera dejar intactos los fragmentos, ni siquiera sabría dónde están.

11

Sí, memset escribe un valor de 32 bits en una región contigua de memoria de una longitud determinada a partir de la dirección indicada. En su caso, memset escribe la región con (valor de 32 bits) 0.

Así que si lo hace un memset de longitud sizeof (your_struct), que debe estar bien:

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

Si es importante, probablemente esté haciendo algo inseguro y no portátil.

Sí, la llamada memset se establezca ninguna bits de relleno (o bytes) a 0 - pero no hay garantía en el idioma que la fijación de un objeto float a todos los bits a cero fijará a 0,0. Lo mismo se aplica a los punteros: no se garantiza que todos los bits cero sea un puntero nulo. (En ambos casos, sucede que es cierto para la mayoría de las implementaciones).

El estándar ISO C90 o C99 original ni siquiera garantizaba que todos los bits cero fuera una representación válida de 0 para tipos enteros; uno de los Corrigenda Técnico posterior a C99 añadió dicha garantía (solo para tipos de enteros).

Para la portabilidad, si desea que algo sea cero, configúrelo explícitamente. También puede aprovechar la inicialización de valor cero para objetos estáticos y para miembros omitidos en los inicializadores.

Una puntilla terminológica: los "bits de relleno" son parte de la representación de los tipos enteros (y normalmente no hay ninguno de ellos). El relleno entre los miembros de la estructura es relleno bytes.

Cuestiones relacionadas