我的程序正在使用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==AT 0x50AFBC9:\u 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==BY0x400993:main(测试C:16)
……
==8238==address 0x53cdb0c是一个大小为15的空闲块中的12个字节
==8238==错误摘要:5个上下文中的43个错误(抑制:4个上下文中的4个)

最佳答案

libconfig将为timeformat值传递一个指向其内部字符串存储的指针。当您执行config_destroy()操作导致全局结构的时间格式指针无效时,它将被释放。为了避免这种情况,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 */

关于c - 全局结构内存错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30077751/

10-09 07:14