2011-08-10 5 views
13

Si c'est un struct alors il peut être faitComment initialiser une union?

*p = {var1, var2..}; 

Mais semble que cela ne fonctionne pas avec union:

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

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

seulement pour obtenir:

expected expression before ‘{’ token 
+1

vous avez deux types de pointeur dans votre union. lequel essayez-vous d'initialiser à null? Comment voulez-vous que le compilateur (ou ce lecteur) sache? –

+0

@ James Wilcox, je sais que je peux le faire par 'u.field1 = NULL; u.field2 = NULL' mais n'est pas ce genre de redondance? – lexer

+0

la question est le champ que vous essayez d'initialiser dans le code ci-dessus. Ni moi ni le compilateur n'a aucune idée si c'est supposé être 'next' ou' s' auquel vous essayez d'accéder. –

Répondre

0

affecter l'une des champs à NULL. Puisque c'est une union tous les champs seront NULL.

23

En C99, vous pouvez utiliser d esignated union initializer:

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

En C++, unions can have constructors.

En C89, vous devez le faire explicitement.

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

thing_t foo; 
foo.x = 2; 

Par ailleurs, savez-vous que dans les syndicats 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; 
} 

sortie:

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

0

Je n'ai pas classe ce State donc je remplacé par un int.

ceci est mon code:

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; 
} 

donc de cette manière, la valeur n est initialisée à 10

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

union Ptrlist1 l = { NULL }; 

voir ce un exemple d'initialisation du syndicat. dans votre cas, je pense qu'il ya une erreur dans

Ptrlist how can be member of union..?? 

vous devriez écrire

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

Il y a une différence entre l'initialisation et l'affectation. L'initialisation est intelligente, tandis que pour l'affectation, vous devez résoudre une adresse correcte.

 

    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