2016-09-10 4 views
1

Je veux un pointeur global vers une structure allouée statiquement.Pointeur global vers une structure allouée statiquement

Cette compile

struct sa{ 
    int a, b; 
    char const* c; 
}; 
struct sa* sap = &(struct sa){42,43,"x"}; 

mais est-ce C portable juridique &, ou dois-je faire quelque chose comme ?:

static struct sa x = {42,43,"x"}; 
struct sa* sap2 = &x; 
+0

vous avez besoin de votre 2ème exemple (déclarer x puis prendre est adr) – bolov

+1

Êtes-vous sûr, @bolov? Il n'est pas immédiatement évident pour moi que vous ne devriez pas être en mesure de prendre l'adresse d'un littéral composé. Je vais devoir faire des recherches. –

+2

Demandez-vous si l'application de l'opérateur d'adresse '&' contre un [littéral composé] (http://en.cppreference.com/w/c/language/compound_literal) est légale? Leur valeur-catégorie est * lvalue *, après tout, donc cela devrait être pris en charge. – WhozCraig

Répondre

1

Apparemment, selon http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf, 6.5.2.5 littéraux composés, 5:

La valeur du littéral composé est celle d'un objet sans nom initialisé par la liste d'initialisation. Si le littéral composé se produit en dehors du corps d'une fonction, l'objet a une durée de stockage statique ; sinon, il a une durée de stockage automatique associée à le bloc englobant.

il est légal lorsqu'il est utilisé dans le cadre mondial.

Merci WhozCraig pour m'avoir fait connaître le nom de la construction afin que je puisse le rechercher. ;)

0

Il est légal lorsqu'il est utilisé dans la portée globale, mais il prend l'adresse d'un littéral, donc si vous essayez de changer la valeur, vous obtiendrez une erreur. Bien que, en lisant votre question, un littéral soit statique, cela pourrait fonctionner pour vous. En ce qui concerne les bonnes pratiques de codage sont concernés, vous pouvez utiliser

const struct sa* sap = &(struct sa){42,43,"x"};

ou, de préférence,

static struct sa x = {42,43,"x"}; const struct sa* sap2 = &x;

+0

Point intéressant et je suis content que vous l'ayez soulevé. Mais selon le brouillon standard dans le lien de ma réponse, le littéral composé sera seulement en lecture seule s'il est marqué const (le membre littéral de chaîne peut toujours être en lecture seule). Gcc accepte et ne met pas le littéral composé en mémoire en lecture seule. – PSkocik