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.

Comme vous le dites vous êtes un débutant, vous êtes probablement toujours en mélangeant les concepts de tableaux et pointeurs en C. ce sont des choses tout à fait différentes, mais qui arrive parfois de regarder la même chose. En particulier, ce que vous avez dans votre structure de données est pas une longueur variable de tableau, il n'est pas un tableau. Vous avez juste deux pointeurs vers quelque chose, où vous également définir le "quelque chose" qui la se pointeurs point.

OriginalL'auteur Tom | 2013-03-04