3

私のプログラムは、値を使用して構成ファイルから読み取り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: メイン (test.c:16)

....

==8238== アドレス 0x53cdb0c は、解放されたサイズ 15 のブロック内の 12 バイトです

==8238== エラーの概要: 5 つのコンテキストから 43 個のエラー (抑制: 4 個から 4 個)

4

2 に答える 2

3

libconfig api マニュアルから

config_lookup_string() によって返される文字列のストレージはライブラリによって管理され、設定が破棄されるか、設定の値が変更されると自動的に解放されます。文字列は、呼び出し元によって解放されてはなりません。

config_lookup_string()したがって、後で使用する場合は、によって返されたポインターを別の配列にコピーする必要があります。config_destroy()

于 2015-05-06T13:17:03.823 に答える