35 votes

Différence entre sizeof (structure vide) et sizeof (structure avec tableau vide)?

J'ai deux structures définies comme suit:

 struct EmptyStruct{

};

struct StructEmptyArr{
    int arr[0];
};

int main(void){
    printf("sizeof(EmptyStruct) = %ld\n", sizeof(EmptyStruct));
    printf("sizeof(StructEmptyArr) = %ld\n", sizeof(StructEmptyArr));

    return 0;
}
 

Compilé avec gcc (g ++) 4.8.4 sur Ubuntu 14.04, x64.

Sortie (pour gcc et g ++):

 sizeof(EmptyStruct) = 1
sizeof(StructEmptyArr) = 0
 

Je peux comprendre pourquoi sizeof(EmptyStruct) est égal à 1 mais ne peux pas comprendre pourquoi sizeof(StructEmptyArr) est égal à 0 . Pourquoi y a-t-il des différences entre deux?

40voto

haccks Points 33022

En C, le comportement d'un programme n'est pas défini si une structure est définie sans aucune nommé membre.

C11-§6.7.2.1:

Si la structure-de la déclaration de la liste ne contient pas tous les membres nommés, soit directement, soit par l'intermédiaire d'un anonyme de la structure, d'anonymes ou de l'union, le comportement est indéfini.

GCC permet à un vide struct comme une extension et sa taille sera 0.


Pour le C++, le standard ne veut pas permettre à un objet de la taille de l' 0 et, par conséquent, sizof(EmptyStruct) retourne une valeur de 1.
Des tableaux de longueur zéro ne sont pas pris en charge par le standard C++1, mais sont pris en charge comme une extension par GNU et l' sizeof opérateur sera de retour 0 si elle est appliquée.


1. § 8.5.1-note de bas de page 107) C++ n'a pas de zéro de tableaux de longueur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X