2017-10-04 12 views
1

Voici une manière pas si commun d'initialisation du pointeur:initialisation d'un pointeur sur les littéraux composés en C

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

Ici, point de pointeur vers littéraux composés.

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

Sortie:

1 

Ce programme est compilé et exécuté bien dans G ++ compilateur.

Ainsi,

  • Est-ce la bonne façon d'initialiser un pointeur vers littéraux composé? ou

  • Est-ce que le comportement non défini initialise le pointeur sur les littéraux composés?

+0

Vous pouvez l'initialiser par: 'int p [10],' et après set 'p [1] = 1' (si vous le codage proprement) – YaatSuka

+0

Il n'est pas un "élément de tableau anonyme", mais un" littéral composé "qui se trouve être un tableau. Demandons autrement: y a-t-il * un * moyen d'utiliser un * composé littéral * comme celui-ci sans jamais le convertir en pointeur? Non. La seule question est la durée de vie du littéral composé. –

+0

"Est-ce la bonne façon d'initialiser le pointeur?" Cela dépend de ce que vous voulez faire avec. Le code est 100% équivalent à 'int arr [10] = {[1] = 1}; int * p = arr; Soit est parfaitement bien si vous voulez un tableau avec portée locale. – Lundin

Répondre

2

Oui, il est correct d'avoir un pointeur vers les littéraux composés. La norme le permet.

n1570-§6.5.2.5 (p8):

EXEMPLE 1 La définition de la portée de fichier

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

initialise p pour pointer sur le premier élément d'un tableau de deux entiers, la première ayant la valeur deux et la seconde, quatre. Les expressions de ce littéral composé doivent être constantes. L'objet sans nom a une durée de stockage statique.

+0

Notez que cet exemple est pour la portée du fichier, cet initialiseur est dans la portée de la fonction, donc il n'a même pas besoin d'avoir des valeurs constantes ... –

+0

@AnttiHaapala; D'accord. C'est juste pour la démonstration qu'il est mentionné dans la norme C. – haccks