2013-04-07 163 views
3

我已經花了年齡試圖弄清楚什麼是與以下程序問題:嵌套結構和指針用C

typedef struct user { 
    char host[40]; 
    int order; 
} user; 

typedef struct data { 
    user userdat; 
} data; 

int read_user (char *datname, user *userdat) { 
    ... 

    fscanf (datin, "%s", &userdat->host); 
    fscanf (datin, "%d", &userdat->order); 

    //1 
    printf ("%d\n", userdat->order); 

    ... 

} 

void init_data (data *dat) { 
    init_userdat (&dat->userdat); 
} 

void init_userdat (user *userdat) { 
    *userdat->host = "127.0.0.1"; 
    userdat->order = 0; 
} 

int user_print (int i, data *dat) { 
    //2 
    printf ("%d\n", dat->userdat.order); 
} 

int main(int argc, char *argv[]) { 

    ... 
    data dat; 
    init_data (&dat); 
    read_user (datname, &dat->userdat); 
    user_print (&dat); 
} 

該方案是非常簡化,以突出的相關章節。會發生什麼是第一個打印語句(// 1)正確輸出值,而第二個(// 2)不是 - 它輸出的東西看起來像是一個可能的內存位置。

我試圖訪問所存儲的變量的多種組合,但我不能破解它。任何幫助,將不勝感激。

EDIT1:修正了在代碼中(不涉及指針或結構)

最後編輯一對夫婦非必要的錯誤:謝謝大家的幫助。 Arun Saha指出的問題確實在原始代碼中,現在已經修復。但是,打印兩個不同字符串的問題仍然存在。您保證代碼原本應該編譯和工作使我發現真正的罪魁禍首 - 我是不正確初始化其他複雜結構的另一部分,這導致在user.order變量的覆蓋。

+2

什麼是'datname'主? – Arun 2013-04-07 00:16:21

+1

更不用說'init_user()'。 – chris 2013-04-07 00:18:11

+1

感謝您試圖簡化您的代碼來說明您的問題。當你這樣做的時候,編譯代碼以確保你不會引入額外的錯誤是非常重要的。請編譯並清理所有編譯器錯誤,以便我們幫助您解決實際問題。 – 2013-04-07 00:24:11

回答

2

以下行不會做什麼它似乎做:-)

*userdat->host = "127.0.0.1"; 

userdata->host是一個指向host[40]數組中的第一個字符。上述語句將只複製源字符串中的一個字符(「127.0.0.1」)。要複製整個字符串,使用標準庫函數stncpy()

strncpy(& userdata->host[ 0 ], "127.0.0.1", 40); 
+1

你是對的;該代碼不會做預期的事情。更糟糕的是,它應該產生編譯警告(關於分配一個指向'char'的指針)。請(@ user2253444)確保您的代碼在提交之前完整地編譯,或者特別要求修復特定警告的幫助。 – 2013-04-07 01:13:44

1

在你main功能,當你調用read_user (datname, &dat->userdat);,我覺得應該有一個編譯問題。這應該是真正read_user (datname, &dat.userdat);dat不是指針,而是一個對象本身。

隨着這一變化而阿倫以前的建議,我已經試過你的程序和它的作品。

+0

謝謝你指出這一點。我在簡化代碼的演示過程中引入了錯誤。 – Matic 2013-04-07 01:22:32