Tableau entier global sans dimension

Quel est le concept lorsque nous définissons un tableau global sans dimension? La sortie est affichée sous la forme 16.

#include  #include  int arr[]; int main(int argc, char *argv[]) { arr[1] = 16; printf("%d\n",arr[1]); system("PAUSE"); return 0; } 

Et même sizeof (arr) ne fonctionne pas. Pourquoi?

    int arr[]; est une définition provisoire là.

    La clause 6.9.2, paragraphe 2 dit:

    La déclaration d’un identifiant pour un object ayant une scope de fichier sans initialiseur, et sans spécificateur de classe de stockage ou avec le spécificateur de classe de stockage static, constitue une définition provisoire . Si une unité de traduction contient une ou plusieurs définitions provisoires pour un identificateur et que l’unité de traduction ne contient aucune définition externe pour cet identificateur, le comportement est exactement comme si l’unité de traduction contenait une déclaration de la scope du fichier de cet identificateur, avec le type composite as de la fin de l’unité de traduction, avec un initialiseur égal à 0 .

    et l’exemple 2 du paragraphe 5 de cette clause précise:

    Si à la fin de l’unité de traduction contient

      int i[]; 

    le tableau i toujours un type incomplet, l’initialiseur implicite lui donne un élément, qui est mis à zéro au démarrage du programme.

    Donc, à la fin de l’unité de traduction , votre tableau arr est de type int[1] . Avant la fin, son type est incomplet, donc sizeof ne fonctionne pas car, dans main , le type de tableau est toujours incomplet.

    Accéder à arr[1] invoque un comportement indéfini, car arr ne comporte qu’un seul élément.

    GCC suppose que l’ arr ne devrait comporter qu’un seul élément. Le fait que vous puissiez accéder à d’autres éléments que arr[0] sans erreur de segmentation n’est qu’une coïncidence. Par exemple, sur ma machine, je peux très bien accéder à arr[1] , arr[10] et arr[100] , mais arr[1000] provoque une erreur de segmentation. En général, l’access à des emplacements en dehors des limites du tableau provoque un comportement indéfini .