1

我有一个声明为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

你能解释一下为什么以及如何纠正它吗?

4

1 回答 1

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'。

于 2013-06-06T01:56:48.207 回答