我有一个声明为extern conf_t conf
的结构。
typedef struct {
int home_dir_len;
char *home_dir;
int key_file_len;
char *key_file;
unsigned int max_mem;
unsigned int runtime;
} conf_t;
我试图通过下面的函数设置变量,但是只设置整数值,而不是字符串。
if (strcmp(tok1, "HOME_DIR") == 0) {
char *dir = strtok(NULL, &delim);
conf.home_dir_len = strlen(dir);
conf.home_dir = dir;
}
else if (strcmp(tok1, "KEY_FILE") ==0) {
char *key = strtok(NULL, &delim);
conf.key_file_len = strlen(key);
conf.key_file = calloc(conf.key_file_len +1, sizeof(char));
conf.key_file = key;
}
else if (strcmp(tok1, "MAX_MEM") ==0) {
conf.max_mem = atoi(strtok(NULL, &delim));
}
else if (strcmp(tok1, "RUNTIME") ==0) {
conf.runtime = atoi(strtok(NULL, &delim));
}
else {
perror("you shouldnt be here");
}
这是输出:
conf.home_dir_len = 5 conf.home_dir = ' and more empty lines ' **This should be /tmp/** conf.key_file_len = 10 conf.key_file = 'nd more empty lines ' **this should be myfile.key** conf.max_mem = 10 conf.runtime = 10
您能解释一下为什么以及如何纠正它?
答案 0 :(得分:1)
在执行if(condition)
分配的每个char *
中,很明显字符串strtok()
正在处理,只是暂时可用于引用。您需要为结构形成字符串的副本。您在conf.key_file =
中部分地执行了此操作(您已分配数据,但未复制字符串)但在conf.home_dir =
中错过了它。推荐:
// delete conf.home_dir = dir;
conf.home_dir = strdup(dir);
...
// delete conf.key_file = calloc(conf.key_file_len +1, sizeof(char));
// delete conf.key_file = key;
conf.key_file = strdup(key);
正如@Carl Norum指出的那样,需要更多的代码。所以虽然上述想法可以解决问题。没有附加代码,它可能只是部分解决方案。
strdup(s)
做3件事。它为s
的副本分配了足够的内存来说's2'。它将's'复制到s2
。然后它返回's2'。