Массивы переменной длины в структуре

я пишу приложение на C (как новичок), и яЯ борюсь с получением поврежденных данных внутри структуры, которая содержит массив переменной длины. Я обнаружил похожие проблемы, описанные в сообщениях на форуме на cprogramming.com, а также в cert.og / secure-coding. Я думал я'Я нашел правильное решение, но, похоже, нет.

Структура выглядит следующим образом;

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;

С проблемным существом "команда», Для любого данного случая (или любой правильной фразы) из "команда» будут установлены разные поля, хотя в большинстве случаев одни и те же поля устанавливаются, хотя и в разных случаях.

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь установить поля ожидаемого_стекла, имени, sw1, sw2, размера и данных. И это'поле данных, которое 'становится коррумпированным. Я'm выделяя память для такой структуры;

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);

Но когда я (довольно) печатаю получившийся cmd, середина поля данных кажется случайным мусором. Я'Мы прошли через GDB и видим, что в поле загружаются правильные данные. Похоже, что этоТолько когда команда передается другой функции, она повреждена. Этот код вызывается внутри функции, такой как;

command* parse(char *line, command *context)

И симпатичная печать происходит в другой функции;

void pretty_print(char* line, command* cmd)

Я думал, что все делал правильно, но, видимо, нет. Насколько я могу судить, я создаю другие экземпляры структуры в порядке (и я продублировал эти подходы для этого), но они неВ них не содержится никакого массива переменной длины, и их симпатичные отпечатки выглядят хорошо - что касается меня, потому что они также могут быть разбиты, но поломка менее очевидна.

Что я'Написание m на самом деле является синтаксическим анализатором, поэтому команда передается в функцию синтаксического анализа (которая описывает текущее состояние, дает подсказки синтаксическому анализатору, что ожидать дальше) и следующую команду (полученную из ввода "линия") возвращается. "контекст» free-d в конце функции синтаксического анализа, которую возвращает новая команда, которая затем будет передана обратно "разобрать» со следующимлиния" ввода.

Кто-нибудь может подсказать, почему это может происходить?

Большое спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос