Quelle est la cause de la flexibilité de la matrice de membre n'est pas à la fin de la struct erreur?
Je me demande pourquoi je continue à faire des error: flexible array member not at end of struct
d'erreur lorsque j'appelle la fonction malloc. J'ai une struct avec une longueur variable de tableau, et je reçois cette erreur.
La structure est,
typedef struct {
size_t N;
double data[];
int label[];
} s_col;
et l'appel à la fonction malloc est,
col = malloc(sizeof(s_col) + lc * (sizeof(double) + sizeof(int)));
Est-ce le bon appel à malloc?
OriginalL'auteur csta | 2012-06-24
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez avoir qu'un flexible de membre du groupe dans une struct, et il doit toujours être le dernier membre de la structure. En d'autres termes, dans ce cas, vous avez mal tourné avant de vous appeler
malloc
, au point qu'il n'y a vraiment aucun moyen d'appelermalloc
correctement pour cette structure.De faire ce que vous semblez vouloir (tableaux de le même nombre de
data
etlabel
membres), vous pourriez envisager quelque chose comme:Noter que c'est un peu différent: au lieu d'un tableau de
double
s suivi par un tableau deint
s, il vous donne un tableau de l'undouble
suivie par unint
, alors la prochainedouble
, à côtéint
, et ainsi de suite. Si c'est assez proche de la même ou non dépendra de la façon dont vous utilisez les données (par exemple, pour passer à une fonction externe qui attend une ligne de tableau, vous aurez probablement à faire les choses différemment).OriginalL'auteur Jerry Coffin
Vous ne pouvez pas avoir
flexible membre du groupe (
double data[]
) dans le milieu. Envisager codé en dur sur la taille du tableau oudouble *data
Ce que vous dites est un peu vrai dans le contexte d'un argument de fonction, où vous pouvez spécifier "un tableau de manipuler argument" qui est techniquement mis en œuvre par le biais d'un pointeur. Normalement (c'est à dire ici) array est un tableau, et le pointeur est un pointeur.
OriginalL'auteur J-16 SDiZ
Donné une struct définition et un pointeur sur le début d'une structure, il est nécessaire que le compilateur C être en mesure d'accéder à tout membre de la structure sans avoir à accéder à autre chose. Depuis l'emplacement de chaque élément au sein de la structure est déterminée par le nombre et les types d'éléments qui le précède, l'accès à tout élément exige que le nombre et les types de tous les éléments précédents connus. Dans le cas particulier où le dernier élément est un tableau, cela ne pose pas de difficulté particulière car l'accès à 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 de précédent éléments, plutôt que le nombre d'éléments dans le tableau lui-même), et l'index de l'élément (le compilateur peut supposer être plus petit que le nombre d'éléments pour lesquels l'espace existe, sans avoir besoin de savoir quelque chose au sujet de la taille de la matrice). Si un Flexible Membre de la pile apparaît n'importe où ailleurs qu'à la fin d'une struct, cependant, l'emplacement de tous les éléments qui ont suivi, elle dépend du nombre d'éléments dans le tableau--quelque chose que le compilateur ne va pas savoir.
OriginalL'auteur supercat