2008-12-12 4 views
5

I ont une structure qui contient un des tableaux d'une autre structure, il ressemble à ceci:initialisation structures/tableaux emboîtés


typedef struct bla Bla; 
typedef struct point Point; 

struct point 
{ 
    int x, y; 
}; 

struct bla 
{ 
    int another_var; 
    Point *foo; 
}; 

Je veux maintenant les initialiser dans la portée globale. Ils sont destinés à la description d'un module. J'ai essayé de le faire avec les littéraux composés de C99, mais le compilateur (gcc) ne m'a pas plu:


Bla test = 
{ 
    0, (Point[]) {(Point){1, 2}, (Point){3, 4}} 
}; 

Je reçois les erreurs suivantes:

 
error: initializer element is not constant 
error: (near initialization for 'test') 

Depuis que je ne ai pas besoin de modifier Je peux y mettre autant de "const" que nécessaire. Y a-t-il un moyen de le compiler?

Répondre

5

Vous n'avez pas besoin d'un littéral composé pour chaque élément, il suffit de créer un composé unique tableau littéral:

Bla test = 
{ 
    0, (Point[]) {{1, 2}, {3, 4}} 
}; 

Assurez-vous que vous compilez avec -std=c99.

+0

Est-ce que cela alloue dynamiquement la mémoire pour les deux points? – aib

+0

@aib: Oui, il crée un tableau de deux structures "ponctuelles" littérales (avec une durée de stockage statique puisqu'il est dans la portée du fichier) et initialise le membre "foo" de "test" pour les pointer. C'est un raccourci qui équivaut à définir un tableau séparément et à assigner le membre "foo" pour le pointer. –