在循环中为结构内的struct分配内存

时间:2015-02-08 05:01:11

标签: c parsing memory-management struct

我正在为一些项目开发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;
}

结果,二进制文件因内存故障而崩溃。我想(不,我知道),我在handler()中错误地分配了内存,但我不明白,我做错了。我花了一整夜的时间试图理解记忆分配,而且我很累,但现在我很有趣,我做错了什么,以及如何强迫这个工作正常。 附:对不起,丑陋的英语

1 个答案:

答案 0 :(得分: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值进行调用,因此modulechannel数组的重新分配无效,您将访问已释放的内存。

同样,在重新分配modulechannel数组时,您应该分配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));