2015-02-08 2 views
0

Я работаю над парсером конфигурации INI-стиля для некоторого проекта, и у меня возникает следующая проблема. У меня есть 3 структуры:Выделение памяти для структуры внутри структуры в цикле

typedef struct { 
    const char* name; 
    unsigned tract; 
    int channel; 
    const char* imitation_type; 
} module_config; 

typedef struct { 
    int channel_number; 
    int isWorking; 
    int frequency; 
    int moduleCount; 
} channel_config; 

typedef struct { 
    int mode; 
    module_config* module; 
    channel_config* channel; 
} settings; 

И у меня есть функции для обработки данных в моем INI-файл (я работаю под inih анализатора): [вставить в pastebin причину слишком долго]. Наконец, в main() я сделал следующее:

settings* main_settings; 
main_settings = (settings*)malloc(sizeof(settings)); 
main_settings->module = (module_config*)malloc(sizeof(module_config)); 
main_settings->channel = (channel_config*)malloc(sizeof(channel_config)); 
if (ini_parse("test.ini", handler, &main_settings) < 0) { 
    printf("Can't load 'test.ini'\n"); 
    return 1; 
} 

В результате бинарные аварии с ошибкой памяти. Я думаю (нет, я знаю), что я неправильно распределяю память в обработчике(), но я не понимаю, где я делаю это неправильно. Я всю ночь пытался понять выделение памяти, и я очень устал, но теперь я просто интересно, что я делаю неправильно, и КАК заставить это работать нормально. P.S. Извините за уродливой английский

+0

Почему бы не просто хранить два структур внутри третьего, без указателей? Косвенное указание указателя кажется ненужным. –

+0

помечен как «непонятный, что вы просите». – Barracuda

+0

@JohnZwinck выдает модули и количество каналов может быть любым. Поэтому я также динамически выделяю память на модуль и канал в главном –

ответ

0

Проблема, как представляется, связано с перераспределением ваших структур:

pconfig = (settings *) realloc(pconfig, (module_count + channel_count) * sizeof(channel_config)); 
pconfig->module = (module_config *) realloc(pconfig->module, module_count * sizeof(module_config)); 
pconfig->channel = (channel_config *) realloc(pconfig->channel, channel_count * sizeof(channel_config)); 

Прежде всего, вы не должны перераспределить основные настройки структуры. Поскольку ваш обработчик всегда будет вызываться с исходным значением pconfig, перераспределение массивов module и channel не имеет эффекта, и вы получите доступ к освобожденной памяти.

Кроме того, когда перераспределить module и channel массив следует выделить count + 1 элементов, так как следующий вызов handler может назначить слот [count].

Так попробуйте заменить три строки выше:

pconfig->module = (module_config *) realloc(pconfig->module, (module_count + 1) * sizeof(module_config)); 
pconfig->channel = (channel_config *) realloc(pconfig->channel, (channel_count + 1) * sizeof(channel_config)); 
+0

Также обратите внимание, что присвоение результата 'realloc()' его первому аргументу всегда является плохой идеей, потому что это приводит к утечке памяти, когда 'realloc()' терпит неудачу. –

Смежные вопросы