Inizializzazione di un puntatore a letterali composti in C

Ecco un modo non comune di inizializzare il puntatore:

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

Qui, puntatore punta a letterali composti.

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

Produzione:

 1 

Questo programma è compilato e funziona bene nel compilatore G ++.

Così,

    • È il modo corretto per inizializzare un puntatore ai letterali composti? o

    • È un comportamento non definito che inizializza il puntatore ai letterali composti?

    Sì, è valido avere un puntatore ai letterali composti. Lo standard lo consente.

    n1570-§6.5.2.5 (p8):

    ESEMPIO 1 La definizione dell’ambito del file

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

    inizializza p per puntare al primo elemento di una matrice di due interi, il primo con valore due e il secondo quattro. Le espressioni in questo composto letterale devono essere costanti. L’object senza nome ha una durata di archiviazione statica .