2017-09-08 4 views
-1

Je vais mettre en œuvre un programme de liste chaînée avec bitfield dans sa structure, quelque chose comme ceci:Est-il correct d'utiliser des champs de bits dans une structure allouée dynamiquement en C?

typedef struct large 
{ 
    unsigned number :4; 
    struct large *next; 
} large; 

int main() 
{ 
    large *g; 
    g=(large *)malloc(sizeof(large)); 

    g->number=15; 
    printf("%d",g->number); 

    return 0; 
} 

Le programme ci-dessus fonctionne correctement mais je lu dans GeeksForGeeks que,

Nous ne pouvons pas avoir de pointeurs sur les éléments de champ binaire car ils ne peuvent pas commencer à une limite d'octet.

Y aura-t-il des problèmes si je le code davantage pour l'implémentation de la liste chaînée?

+2

Quel est exactement le problème? Vous n'avez aucun pointeur sur les membres du champ de bits. –

+1

Vous savez que cela ne vous sauvera rien, n'est-ce pas? Et pourquoi voulez-vous utiliser des bitfields du tout? Ils n'ont de sens que pour la sécurité de la mémoire, êtes-vous sur une plate-forme fortement limitée en mémoire? – Olaf

+0

En C, vous n'avez pas besoin de typer le résultat de retour de malloc – MCG

Répondre

3

Le pointeur g dans votre programme est un pointeur vers une variable de structure à laquelle vous avez alloué dynamiquement de la mémoire.

g->number n'est pas l'adresse du membre number mais sa valeur.

Vous ne pouvez pas avoir un pointeur comme

unsigned char *ptr=&(g->number); 

vous devriez obtenir une erreur comme cannot take address of bit-field

0

malloc-tion des structures, y compris ceux contenant bitfields est absolument OK

We cannot have pointers to bit field members as they may not start at a byte boundary. 

Mais vous n'obtenez pas l'adresse du champ de bits - seulement pour la structure elle-même et sa taille et son emplacement est toujours un multiple de byte.