La longueur Variable des tableaux dans la struct
Je suis en train d'écrire une application en C (comme un débutant) et j'ai du mal avec les obtenir endommagé données à l'intérieur d'une structure qui contient une longueur variable tableau. J'ai trouvé des problèmes similaires décrites dans les messages du forum sur cprogramming.com et aussi sur cert.og/secure-codage. Je pensais que je l'avais trouvé la bonne solution, mais il ne semble pas.
La structure ressemble à ceci;
typedef struct {
int a;
int b;
} pair;
typedef struct {
CommandType name;
pair class;
pair instr;
pair p1;
pair p2;
pair p3;
CommandType expected_next;
char* desc;
int size;
pair sw1;
pair sw2;
pair* data;
} command;
Avec la problématique de l'étant "commande". Pour une instance donnée (ou quelle que soit la phrase correcte serait) de "commande" différents domaines seraient ensemble, même si dans la plupart des cas, les mêmes champs sont définis, mais dans les différentes instances.
Le problème que j'ai est lorsque vous tentez de définir la expected_next, nom, sw1, sw2, la taille et les champs de données. Et c'est le champ de données qui se corrompre. Je suis de l'allocation de mémoire pour la structure comme ceci;
void *command_malloc(int desc_size,int data_size)
{
return malloc(sizeof(command) +
desc_size*sizeof(char) +
data_size*sizeof(pair));
}
command *cmd;
cmd = command_malloc(0, file_size);
Mais quand j'ai (assez) imprimer le résultat cmd, au milieu du champ de données semble être aléatoire d'ordures. J'ai franchi avec gdb et peut voir que les bonnes données sont chargées dans le champ. Il semble que c'est seulement quand la commande est passée à une fonction différente qu'il est corrompu. Ce code est appelé à l'intérieur d'une fonction, telle que;
command* parse(char *line, command *context)
Et le moteur d'impression se produit dans une autre fonction;
void pretty_print(char* line, command* cmd)
J'avais pensé a faire les choses correctement, mais apparemment pas. Aussi loin que je peux dire, j'en construire d'autres instances de la structure d'accord (et j'ai dupliqué ces approches pour celui-ci), mais ils ne contiennent pas de longueur variable tableau en eux et leur belle-imprime a l'air bien qui me concerne, car ils pourraient également être brisé, mais la rupture est moins évident.
Ce que j'écris est en fait un parser, si une commande est passée dans la fonction d'analyse (qui décrit l'état actuel, donnant des indications à l'analyseur à quoi s'attendre) et la commande suivante (dérivé à partir de l'entrée "ligne") est retourné. "contexte" est gratuite-d à la fin de la fonction d'analyse, que la nouvelle se retourna - qui serait ensuite passé en "analyser" à la prochaine "ligne" de l'entrée.
Quelqu'un peut-il suggérer quoi que ce soit pour expliquer ce qui se passe?
Merci beaucoup.
OriginalL'auteur Tom | 2013-03-04
Vous devez vous connecter pour publier un commentaire.
Vous devez allouer des desc et les données séparément.
Lorsque vous allouez à votre struct commande *cmd, la mémoire est allouée pour votre pointeurs des cad et des données. Desc et les données doivent être malloced séparément.
Donc affecter votre commande
alors d'allouer de la mémoire pour les données ou desc
exemple pour desc:
OriginalL'auteur
Lorsque vous allouer de la mémoire pour la structure, seulement une taille de pointeur est attribué à *desc. Vous devez allouer de la mémoire à l'espace (tableau sommaire) desc points, comme quelqu'un l'a déjà souligné. Le but de ma réponse est de montrer de façon légèrement différente de le faire.
Puisque le fait d'avoir un pointeur *desc augmente la taille de la structure par un mot (sizeof pointeur), vous pouvez en toute sécurité ont une longueur variable de la matrice de hack dans la structure afin de réduire la taille de la structure.
Voici comment votre structure doit ressembler, notez que desc[] a été tiré vers le bas à l'extrémité de la structure :
Maintenant,
1. Allouer de la mémoire pour la commande qui inclut la taille de la matrice aussi :
Utilisation desc :
cmd->desc[desc_length -1] = '\0';
Ce hack ne fonctionne que si le membre est à l'extrémité de la structure, permet d'économiser la taille de la structure, permet d'économiser pointeur d'adressage indirect, peut être utilisé si la longueur du tableau est une structure de l'instance spécifique.
OriginalL'auteur NeilBlue