将 const char * 复制到 char **

Copy a const char * into a char **

我正在使用 libconfig 库从文件中读取一些配置数据。我无法提取用于解析信息和事后清理的功能。

运行 strcpy(*hostname, tmp) 导致核心转储。

hostnameportip初始化为NULL.

int parseConfig(char **hostname, char **port, char **ip) {

    config_t cfg, *cf;
    const char *tmp;

    cf = &cfg;
    config_init(cf);

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

    config_lookup_string(cf, "hostname",  &tmp);
    strcpy(*hostname, tmp);
    config_lookup_string(cf, "ip", &tmp);
    strcpy(*ip, tmp);
    config_lookup_string(cf, "port", &tmp);
    strcpy(*port, tmp);

    config_destroy(cf);

    return(EXIT_SUCCESS);
}

由于它们被初始化为 NULL,您应该为它们分配足够的内存space。

config_lookup_string(cf, "hostname",  &tmp);
*hostname = malloc(strlen(tmp)+1);
strcpy(*hostname, tmp);
config_lookup_string(cf, "ip", &tmp);
*ip = malloc(strlen(tmp)+1);
strcpy(*ip, tmp);
config_lookup_string(cf, "port", &tmp);
*port = malloc(strlen(tmp)+1);
strcpy(*port, tmp);

或者,如果您有 strdup() 可用,

config_lookup_string(cf, "hostname",  &tmp);
*hostname = strdup(tmp);
config_lookup_string(cf, "ip", &tmp);
*ip = strdup(tmp);
config_lookup_string(cf, "port", &tmp);
*port = strdup(tmp);

去掉中间商

config_lookup_string(cf, "hostname",  hostname);

这要求您永远不要破坏 cfg,因为它拥有为配置字符串分配的内存。

static config_t cfg;
config_t *cf;

// config_destroy(cf); <-- don't!

如果每个程序只读取一次配置,这应该不是问题 运行。