2011-08-10 15 views
13

Si es un struct entonces se puede hacer¿Cómo inicializar una unión?

*p = {var1, var2..}; 

Pero parece que esto no funciona con union:

union Ptrlist 
{ 
     Ptrlist *next; 
      State *s; 
}; 

Ptrlist *l; 
l = allocate_space(); 
*l = {NULL}; 

sólo para obtener:

expected expression before ‘{’ token 
+1

tiene dos tipos de puntero en su unión. ¿cuál estás tratando de inicializar para nulo? ¿Cómo espera que el compilador (o este lector) lo sepa? –

+0

@James Wilcox, sé que puedo hacerlo por 'u.field1 = NULL; u.field2 = NULL' pero ¿no es ese tipo de redundancia? – lexer

+0

la pregunta es qué campo estás tratando de inicializar en el código anterior. ni yo ni el compilador tenemos idea de si se supone que es 'next' o' s' a lo que intenta acceder. –

Respuesta

0

asignar una de las campos a NULL. Como es una unión, todos los campos serán NULL.

23

En C99, se puede utilizar un d esignated union initializer:

union { 
     char birthday[9]; 
     int age; 
     float weight; 
     } people = { .age = 14 }; 

En C++, unions can have constructors.

En C89, tiene que hacerlo explícitamente.

typedef union { 
    int x; 
    float y; 
    void *z; 
} thing_t; 

thing_t foo; 
foo.x = 2; 

Por cierto, ¿es consciente de que en las uniones C, all the members share the same memory space?

int main() 
{ 
    thing_t foo; 
    printf("x: %p y: %p z: %p\n", 
    &foo.x, &foo.y, &foo.z); 
    return 0; 
} 

salida:

x: 0xbfbefebc y: z 0xbfbefebc: 0xbfbefebc

0

no tengo una clase State así que lo reemplazó con un int.

este es mi código:

union Ptrlist 
{ 
    Ptrlist *next; 
    int *n; 
}; 


int main(int argc, char** argv) 
{ 
    Ptrlist *l = new Ptrlist; 

    // I'm using a way c++ allocated memory here, you can change it to malloc. 
    l->n = new int; 
    *(l->n) = 10; 

    // Because you used an union, n's and next's addres is same 
    // and this will output 10 
    printf("%d", *(l->next)); 

    getch(); 
    return 0; 
} 

Así de esta manera, el valor de n se inicializa a 10

0
union Ptrlist1 
{ 
    char *next; 
    char *s; 
}; 

union Ptrlist1 l = { NULL }; 

ver esto un ejemplo de unión de inicialización. en su caso creo que hay algún error en

Ptrlist how can be member of union..?? 

debe escribir

union Ptrlist 
{ 
    union Ptrlist *next; 
     State *s; 
}; 
1

Hay diferencia entre la inicialización y asignación. La inicialización es inteligente, mientras que para la tarea debe resolver la dirección correcta.

 

    Example 
    char str[] = "xyz"; // works - initialization 
    char str[10]; 
    str = "xyz";   // error - assignment 
          // str is a address that can hold char not string 

    Similarly 
    Ptrlist l = {NULL}; // works - initialization 
    Ptrlist *l; 
    l->next = NULL;  // works assignment 
    l = {NULL};   // is assignment, don't know the address space error