1

構成ファイルからパラメーターを読み取るために使用libconfig.hしていますが、関数の内外で値を出力する際に​​問題があります。

たとえば .h

int get_config();

example.c

#include <stdio.h>
#include <stdlib.h>
#include <libconfig.h>
#include "example.h"

typedef struct Conf{
    int myInt;
    const char *myString;
}Conf;

#define CONFIGFILE "./my.conf"
Conf *config;


int get_config(){
    config_t cfg;
    config_init(&cfg);

    if (!config_read_file(&cfg, CONFIGFILE)) {
        fprintf(stderr, "%s:%d - %s\n",
            config_error_file(&cfg),
            config_error_line(&cfg),
            config_error_text(&cfg));
        config_destroy(&cfg);
        return(EXIT_FAILURE);
    }

    if(config_lookup_int(&cfg,"myInt", &config->myInt)){
        printf("myInt = %d\n", config->myInt);
    }

    if(config_lookup_string(&cfg,"myString", &config->myString)){
        printf("myString = %s\n", config->myString);
    }

    config_destroy(&cfg);
    return 0;
}

int main(){
    config = (Conf*) malloc(sizeof(Conf));
    if(get_config() == EXIT_FAILURE){
        return 0;
    }
    get_config();

    printf("myInt = %d\n",config->myInt);
    printf("myString = %s\n",config->myString);

    return 0;
}

myInt内側/外側の印刷値はget_config()同じです。の場合myStringmain()以前に出力されたものとは異なる偽の文字が返されます。

どうしたの?

4

1 に答える 1

1

libconfigマニュアルから:

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

あなたconfig_t cfgはローカルでget_configあり、その機能を離れた後は範囲外になります。つまり、(a) 後でcfg適切にクリーンアップできないことconfig_destroy()、および (b) スタック領域が上書きされたため、内部の参照cfgにアクセスできない可能性があることを意味します。

strdupin で文字列のコピーを作成できますget_config。その場合は、ローカル ファイルを開くのと同じようcfgに、の最後で破棄します。また、後で文字列に注意してください。get_configfclosefree

もう 1 つの方法は、cfgローカルにしmainて、プログラムの実行中に有効にしておくことです。にポインタとして渡し&cfg、から戻る前に破棄します。その場合、文字列は有効である限り有効です。get_configcfgmaincfg

于 2014-10-16T10:54:21.827 に答える