【问题标题】:Problems with string and charset using libconfig.h使用 libconfig.h 的字符串和字符集问题
【发布时间】:2014-12-11 16:06:46
【问题描述】:

我正在使用libconfig.h 从配置文件中读取参数,但在函数内部/外部打印值时遇到问题。

example.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() 中的调用返回虚假字符,与之前打印的不同。

怎么了?

【问题讨论】:

标签: c struct config libconfig


【解决方案1】:

来自libconfig manual

config_lookup_string() 返回的字符串的存储由库管理,并在设置被销毁或设置值更改时自动释放;调用者不得释放该字符串。

您的config_t cfgget_config 的本地地址,并且在离开该功能后超出范围。这意味着 (a) 以后您无法使用 config_destroy() 正确清理 cfg,并且 (b) 可能无法访问 cfg 中的任何引用,因为堆栈空间已被覆盖。

您可以在get_config 中复制带有strdup 的字符串。在这种情况下,在get_config 的末尾销毁cfg,就像你在fclose 任何打开的本地文件一样。以后还要注意free你的字符串。

另一种方法是使 cfg 局部于 main 并在程序执行期间保持其活动状态。将&amp;cfg 作为指针传递给get_config,并在从main 返回之前销毁cfg。在这种情况下,只要cfg 有效,字符串就会有效。

【讨论】:

  • 对不起,我省略了config_destroy(),但这不是问题所在。运行它,我得到了函数内部的值(Ok),但在 main 中只有 int 值是正确的。该字符串向我显示虚假字符(例如 �e4)。
  • 我的回答解决了这个问题:您的字符串,即保存它所需的内存,没有“保持活力”足够长的时间。您要么必须制作一个副本(并且不在乎原始字符串何时“消亡”),要么通过将cfg 设为main 中的变量来使拥有原始字符串的cfg 寿命足够长。跨度>
  • 字符串作为指针存储在Conf 中。当它指向的东西不再有效时,指针就没有用了。这就是你的情况。 (嗯,这就是可能发生的情况;我没有尝试过,因为我不想安装libconfig。)int 没有这个问题。
  • 谢谢!现在它运行了,让我的字符串活着:) libconfig 是一个好的解决方案吗? “更好”的东西?
  • 我没有使用libconfig 的经验,但从我所看到的情况来看,它对我来说看起来不错。比自己滚动要好。指向 char 数组的指针失效的问题不是 libconfig 的问题,而是 C 的问题。准备更频繁地处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2022-08-19
  • 1970-01-01
  • 2014-04-18
  • 2010-12-07
  • 1970-01-01
相关资源
最近更新 更多