Quelle est la cause du membre de tableau flexible non à la fin de l’erreur de struct?

Je me demande pourquoi je continue à avoir des error: flexible array member not at end of struct erreur error: flexible array member not at end of struct lorsque j’appelle malloc. J’ai une structure avec un tableau de longueur variable, et je continue à avoir cette erreur.

La structure est,

 typedef struct { size_t N; double data[]; int label[]; } s_col; 

et l’appel à malloc est,

 col = malloc(sizeof(s_col) + lc * (sizeof(double) + sizeof(int))); 

Est-ce l’appel correct à Malloc?

Vous ne pouvez avoir qu’un seul membre de tableau flexible dans une structure et ce dernier doit toujours être le dernier membre de la structure. En d’autres termes, dans ce cas, vous vous êtes trompé avant d’appeler malloc , au point qu’il est vraiment impossible de l’appeler correctement pour cette structure.

Pour faire ce que vous semblez vouloir (des tableaux du même nombre de data et des membres d’ label ), vous pouvez envisager quelque chose comme:

 struct my_pair { double data; int label; }; typedef struct { size_t N; struct my_pair data_label[]; }; 

Notez que ceci est toutefois un peu différent: au lieu d’un tableau de double s suivi d’un tableau d’ int , il vous donne un tableau d’un double suivi d’un int , puis du double suivant, du prochain int , etc. Que cela soit assez proche ou non de la même chose dépendra de la façon dont vous utilisez les données (par exemple, pour passer à une fonction externe qui attend un tableau contigu, vous devrez probablement faire les choses différemment).

 typedef struct { size_t N; double data[]; int label[]; } s_col; 

Vous ne pouvez pas avoir un membre de tableau flexible ( double data[] ) au milieu. Considérez la taille du tableau codé en dur ou les double *data

Étant donné une définition de structure et un pointeur vers le début d’une structure, il est nécessaire que le compilateur C puisse accéder à n’importe quel membre de la structure sans avoir à accéder à autre chose. Étant donné que l’emplacement de chaque élément de la structure est déterminé par le nombre et le type d’éléments précédents, l’access à tout élément nécessite la connaissance du nombre et des types de tous les éléments précédents. Dans le cas particulier où le dernier élément est un tableau, cela ne pose pas de difficulté particulière car accéder à un élément dans un tableau nécessite de savoir où il commence (ce qui nécessite de connaître le nombre et le type des éléments précédents plutôt que le nombre d’éléments dans le tableau. lui-même), et l’index d’éléments (que le compilateur peut supposer être plus petit que le nombre d’éléments pour lesquels il existe de l’espace, sans rien connaître de la taille du tableau). Si un membre de groupe flexible apparaissait ailleurs qu’à la fin d’une structure, l’emplacement des éléments qui le suivraient dépendrait du nombre d’éléments du tableau, ce que le compilateur ne saura pas.