Initialisation d’un pointeur sur les littéraux composés en C

Voici une façon pas si courante d’initialiser le pointeur:

int *p = (int[10]){[1]=1}; 

Ici, les pointeurs pointent vers les littéraux composés.

 #include  int main(void) { int *p = (int[10]){[1]=1}; printf("%d\n", p[1]); } 

Sortie:

 1 

Ce programme est compilé et fonctionne correctement dans le compilateur G ++.

Alors,

  • Est-ce la bonne façon d’initialiser un pointeur sur des littéraux composés? ou

  • Est-ce comportement indéfini initialiser pointeur sur les littéraux composés?

Oui, il est valide d’avoir un pointeur sur les littéraux composés. La norme permet cela.

n1570-§6.5.2.5 (p8):

EXEMPLE 1 La définition de la scope du fichier

 int *p = (int []){2, 4}; 

initialise p pour qu’il pointe vers le premier élément d’un tableau de deux entiers, le premier ayant la valeur deux et le second, quatre. Les expressions dans ce littéral composé doivent être constantes. L’object non nommé a une durée de stockage statique .