2013-06-06 60 views
1

我有一個結構聲明爲extern conf_t confextern關鍵字和設置字符串變量

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 

能否請您解釋一下爲什麼,我該如何糾正呢?

+3

您在這裏沒有真正顯示足夠的上下文。結構的定義是什麼?至少,你泄露了calloc調用的結果。 'sizeof(char)'是'1'。 –

+0

如何編輯我的代碼沒有做到這一點,我添加了釋放calloc的第二部分,看它是否發揮了作用,但它沒有,因爲它們都仍然不正確 – cxzp

回答

1

在您執行char *分配的每個if(condition)中,顯然字符串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)做三兩件事。它爲s的副本分配了足夠的內存來表示's2'。它將''複製到s2。然後它返回's2'。

+0

感謝,完美的工作,我設法昨晚進行修復但在這裏更新它已經太晚了,我最終調用了空間,然後使用了strcpy,但是strdup更聰明! – cxzp