La taille que vous fournissez pour un tableau doit être une expression constante. Vous avez deux choix. On serait d'inclure quelques pointeurs et allouer l'espace dynamique:
typedef struct {
int* original;
int size;
int *first;
int *second;
} arr_struct;
Une autre possibilité serait d'utiliser un seul tableau, et de créer un pointeur au point approprié dans ce:
typedef struct {
int* original;
int size;
int *second;
int first[];
} arr_struct;
Cela utilise un membre de groupe flexible, ce qui est nouveau avec C99 - si vous utilisez un compilateur C obsolète (par exemple, MS VC++) il peut ne pas être pris en charge directement . Dans tous les cas, cela nécessite toujours une allocation dynamique, mais vous permet de faire une allocation importante pour toutes les données au lieu de trois allocations distinctes (une pour la structure et une pour chaque first
et second
).
arr_struct *my_struct = malloc(sizeof(*my_struct) + size * sizeof(int));
my_struct->second = my_struct->first + size/2;
En aparté, notez la syntaxe pour typedef
- comme il était, votre typedef
ne définissait pas un nom du tout.
La solution est triviale si - il suffit de définir first
avec une taille de 1 et soustrayez 1 de la taille de votre allocation:
arr_struct *my_struct = malloc(sizeof(*my_struct) + (size-1) * sizeof(int));
En théorie, ce n'est pas nécessaire de travailler, mais En fait, c'est très bien avec tous les vrais compilateurs, au moins AFAIK.
J'aime 'size- (size/2)' pour les tailles impaires! :-) – pmg
@pmg: merci: D – Aboelnour
qu'en (taille + 1)/2 ?? –