Массивы переменной длины в структуре
я пишу приложение на 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 в конце функции синтаксического анализа, которую возвращает новая команда, которая затем будет передана обратно "разобрать» со следующимлиния" ввода.
Кто-нибудь может подсказать, почему это может происходить?
Большое спасибо.