Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C extern关键字和设置字符串变量_C_String_Extern - Fatal编程技术网

C extern关键字和设置字符串变量

C extern关键字和设置字符串变量,c,string,extern,C,String,Extern,我有一个结构声明为extern conf\u 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; 我试图通过下面的函数设置它的变量,但是只设置整数值,而不

我有一个结构声明为
extern conf\u 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");
}   
这是输出:

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

在每个
如果(条件)
执行
char*
赋值的地方,很明显,正在处理的字符串
strtok()
只是一个临时的可供参考的字符串。您需要为您的结构形成字符串的副本。您在
conf.key\u文件=
中部分地完成了(分配了数据,但没有复制字符串),但在
conf.home\u 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
做3件事。它为
s
的副本分配了足够的内存,比如说“s2”。它将“s”复制到
s2
。然后返回“s2”。

在执行
char*
赋值的每个
if(condition)
中,字符串
strtok()
正在处理的字符串显然只是可供引用的临时字符串。您需要为您的结构形成字符串的副本。您在
conf.key\u文件=
中部分地完成了(分配了数据,但没有复制字符串),但在
conf.home\u 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
做3件事。它为
s
的副本分配了足够的内存,比如说“s2”。它将“s”复制到
s2
。然后返回“s2”。

您在这里没有显示足够的上下文。结构的定义是什么?至少,您正在泄漏
calloc
调用的结果。而
sizeof(char)
1
。我如何编辑我的代码以避免这样做,我为第二部分添加了calloc以查看它是否有区别,但它没有,因为它们仍然不正确。您还没有在这里显示足够的上下文。结构的定义是什么?至少,您正在泄漏
calloc
调用的结果。而
sizeof(char)
1
。我如何编辑我的代码才能不这样做,我为第二部分添加了calloc以查看它是否有所不同,但没有,因为它们都仍然不正确。这很好地工作了,我昨晚设法修复了它,但在这里更新太晚了,我最后调用了空间,然后使用strcpy,但是strdup更聪明!感谢它工作得很好,我昨晚设法修复了它,但在这里更新太晚了,我最终调用了空间,然后使用strcpy,但是strdup更聪明!