2017-07-10 2 views
-4

La taille d'une union est égale à la taille du membre le plus grand. Mais dans l'union suivante, la taille est montrée être 8 octets. La taille de int et float est de 4 octets. Pourquoi montre-t-il 8 octets?sizeof union in C

union data { 
    int i; 
    float f; 
    char *str; 
}; 
+0

Avez-vous vérifié la taille du caractère *? Cela pourrait être la cause. – Mints97

+3

Peut-être essayer d'imprimer le «sizeof» de chacun des éléments séparément comme l'un d'eux est évidemment 8 octets –

+11

J'ai X, Y et Z. Cela provoque W. J'ai vérifié X, Y et ils ne sont pas la cause de W Qu'est-ce qui pourrait causer W? –

Répondre

6

sizeof (char *) est la taille du pointeur. Il s'agit généralement de 4 machines 32 bits et de 8 machines 64 bits. Compte tenu de votre résultat, je suppose que vous êtes sur une machine 64 bits.

-1

Si votre compilateur utilise double pour float par défaut, il y a de fortes chances que sizeof (float) soit 8. Just printf ("% d", sizeof (float)); pour le vérifier.

5
#include <stdio.h> 

union data_t { 
    int i; 
    float f; 
    char *str; 
}; 

int main() 
{ 
    union data_t data; 
    printf("%zu\n%zu\n%zu\n", sizeof (data.i), sizeof (data.f), sizeof (data.str)); 
    printf("\nsizeof(char*): %zu\nsizeof(char): %zu\n", sizeof(char *), sizeof(char)); 
} 

Sortie:

$ ./a.out 
4 
4 
8 

sizeof(char*): 8 
sizeof(char): 1 
+0

Sur une machine 64 bits avec des pointeurs de 8 octets, 'size_t' peut être plus large que' int', ce qui entraîne des problèmes avec l'utilisation de ce code de '% d' avec' size_t', le type de résultat de 'sizeof' . Recommander '"% zu "' – chux

+0

@chux L'a corrigé. – klutt

2

Essayez le code ci-dessous sur un ordinateur Windows 64/Linux 64 et le résultat devrait être 8, sur un système 32 bits devrait être 4.

int main(void) 
{ 
    char * str; 

    printf("%d\n",sizeof(str)); 

    return 0; 

} 
2

Taille de l'union = taille du plus grand type de données utilisé

La mémoire o La participation d'un syndicat sera suffisante pour accueillir le plus grand membre du syndicat. Peu importe ce qui est actuellement utilisé. Par exemple,

union Data 
{ 
    int i; 
    float f; 
    char str[20]; 
} data; 

Maintenant, une variable de type de données peut stocker un nombre entier, un nombre à virgule flottante ou une chaîne de caractères. Cela signifie qu'une seule variable, c'est-à-dire le même emplacement de mémoire, peut être utilisée pour stocker plusieurs types de données. Le type de données occupera 20 octets d'espace mémoire car il s'agit de l'espace maximal pouvant être occupé par une chaîne de caractères.