我正在为一些项目开发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()中错误地分配了内存,但我不明白,我做错了。我花了一整夜的时间试图理解记忆分配,而且我很累,但现在我很有趣,我做错了什么,以及如何强迫这个工作正常。 附:对不起,丑陋的英语
答案 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
值进行调用,因此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));