将 const char * 复制到 char **
Copy a const char * into a char **
我正在使用 libconfig
库从文件中读取一些配置数据。我无法提取用于解析信息和事后清理的功能。
运行 strcpy(*hostname, tmp)
导致核心转储。
hostname
、port
、ip
初始化为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!
如果每个程序只读取一次配置,这应该不是问题 运行。
我正在使用 libconfig
库从文件中读取一些配置数据。我无法提取用于解析信息和事后清理的功能。
运行 strcpy(*hostname, tmp)
导致核心转储。
hostname
、port
、ip
初始化为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!
如果每个程序只读取一次配置,这应该不是问题 运行。