我的程序使用libconfig
从配置文件中读取并将值保存到全局结构中。它的工作正常,但valgrind说出现了错误。并且错误仅显示char指针变量。那是什么错误以及如何解决这个问题?谢谢
#include <stdio.h>
#include <libconfig.h>
#include "stdlib.h"
#define conf_file "myconf"
struct setting_data
{
int number;
const char* timeformat;
};
struct setting_data conf_data;
void read_config();
int main(){
read_config();
printf("%d @ %p\n", conf_data.number,&conf_data.number);
printf("%s @ %p\n", conf_data.timeformat,&conf_data.timeformat);
}
void read_config(){
config_t cfg;
// config_setting_t *rules, *settings,*m_number,*device,*sendduration,*pin_code;
config_init(&cfg);
if(! config_read_file(&cfg, conf_file))
{
fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
config_error_line(&cfg), config_error_text(&cfg));
config_destroy(&cfg);
exit(1);
}
// conf_data.number = config_setting_get_int (config_lookup(&cfg, "number" ));
config_lookup_int(&cfg,"number",&conf_data.number);
config_lookup_string(&cfg, "timeformat", &conf_data.timeformat);
config_destroy(&cfg);
}
== 8238 ==读取大小为1
== 8238 ==在0x50AFBC9:_IO_file_xsputn @@ GLIBC_2.2.5(fileops.c:1317)
== 8238 == by 0x5083972:vfprintf(vfprintf.c:1629)
== 8238 == by 0x508C269:printf(printf.c:35)
== 8238 == by 0x400993:main(test.c:16)
...
== 8238 ==地址0x53cdb0c是一个大小为15的块内的12个字节,免费
== 8238 ==错误摘要:来自5个上下文的43个错误(被抑制:4个中的4个)
答案 0 :(得分:3)
config_lookup_string()返回的字符串的存储由库管理,并在销毁设置或更改设置值时自动释放;调用者不得释放字符串。
因此,如果要在config_lookup_string()
之后使用它,则需要将config_destroy()
返回的指针复制到另一个数组中
答案 1 :(得分:2)
libconfig正在向您传递指向timeformat
值的内部字符串存储的指针。当你执行config_destroy()
导致全局结构的时间格式指针无效时,它将被释放。为了避免这个strdup()
由libconfig返回给你的timeformat字符串:
const char *time_str;
config_lookup_string(&cfg, "timeformat", &time_str);
conf_data.timeformat = strdup(time_str);
config_destroy(&cfg);
/* conf_data.timeformat is still valid */