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 に答える