Quelle sera la valeur de l’élément non initialisé dans le tableau?

J’ai le code suivant

int t[] = { [1] = 45, [2] = 33 }; 

Quelle sera la valeur de t[0] dans ce cas? Il va contenir des ordures?

Les autres valeurs seront initialisées; de la norme C11, § 6.7.9 Initialisation , § 19 et 21:

L’initialisation doit se dérouler dans l’ordre de la liste des initialiseurs, chaque initialiseur fourni pour un sous-object particulier écrasant tout initialiseur précédemment indiqué pour le même sous-object; 151) tous les sous-objects qui ne sont pas initialisés explicitement doivent être initialisés implicitement de la même manière que les objects ayant une durée de stockage statique.

151) Tout initialiseur du sous-object qui est remplacé et qui n’est donc pas utilisé pour initialiser ce sous-object peut ne pas être évalué du tout.


Si la liste entourée d’accolades contient moins d’initialiseurs que d’éléments ou de membres d’un agrégat, ou moins de caractères dans un littéral de chaîne utilisé pour initialiser un tableau de taille connue par rapport au nombre d’éléments contenus dans le tableau, le rest de l’agrégat doit être initialisé implicitement de la même façon que les objects ayant une durée de stockage statique.

Et int non initialisé avec la durée de stockage statique sont implicité initialisé à zéro; même section, ¶10:

Si un object ayant une durée de stockage automatique n’est pas initialisé explicitement, sa valeur est indéterminée. Si un object ayant une durée de stockage statique ou de thread n’est pas explicitement initialisé, alors:

  • s’il est de type pointeur, il est initialisé à un pointeur nul;
  • s’il est de type pointeur, il est initialisé à un pointeur nul;
  • s’il est de type arithmétique, il est initialisé à zéro (positif ou non signé) ;
  • s’il s’agit d’un agrégat, chaque membre est initialisé (récursivement) conformément à ces règles et tout remplissage est initialisé à zéro bit;
  • s’il s’agit d’une union, le premier membre nommé est initialisé (de manière récursive) conformément à ces règles et tout remplissage est initialisé à zéro bit;

Le comportement est le même dans C89 et C99.