2011-03-30 52 views
3

這是我的問題,其中一個rcvfrom()參數是一個char *,一旦我從中獲得了數據,我想將它轉換爲結構體。但是,演員陣容不成功。我究竟做錯了什麼?是否可以將char *轉換爲結構?

這裏是我做過什麼:

struct { 
    int8_t seq; 
    int8_t ack; 
    bool flag; 
    char data[payload]; 
}r_pckt; 
//...bunch of codes 

char *buf = NULL; 
buf = (char *)malloc (sizeof(char) * MTU); 
memset(buf, 0, MTU); 
//... 

res = recvfrom(socket_fd, buf, MTU, 0,(struct sockaddr *) &cli_addr, (socklen_t *)&cli_len); 
//.. 
r_pckt *tmp_pckt = (struct r_pckt *) &buf; 

而且這是行不通的。有任何想法嗎? 謝謝。

回答

9
typedef struct { 
    int8_t seq; 
    int8_t ack; 
    bool flag; 
    char data[payload]; 
} r_pckt; 

以上使得r_pckt是一個類型,而不是一個變量。然後,

r_pckt *tmp_pckt = (struct r_pckt *) &buf; 

應該

r_pckt *tmp_pckt = (r_pckt *) buf; 
+0

謝謝我擺脫了錯誤。但是現在我正在做一個printf來查看我是否可以訪問內部字段。我這樣做: printf(「Incoming =%s \ n」,tmp_pckt.payload);和我有一個錯誤說:請求成員'有效載荷'的東西不是一個結構或工會 – fabricemarcelin 2011-03-30 20:23:23

+0

我明白了。我需要做tmp_pckt->有效載荷:) – fabricemarcelin 2011-03-30 20:28:18

1

r_pckt不是結構體名稱,而是變量名稱。嘗試

struct r_pckt { 
    int8_t seq; 
    int8_t ack; 
    bool flag; 
    char data[payload]; 
}; 

是的,馬克是正確的,你不需要&那裏。

P.S.實際上,當「不起作用」時,它也會爲您提供值得閱讀的有意義的錯誤消息。

1

您需要刪除&中投。而且(正如其他人已經指出的那樣),你在結構定義和變量聲明中有不一致的地方。我認爲大多數編譯器都會捕獲這個問題,所以我懷疑在發佈問題時會發生剪切粘貼錯誤。

struct r_pckt *tmp_pckt = (struct r_pckt *) buf; 
0
r_pckt *tmp_pckt = (struct r_pckt *) &buf; 

應該是:

r_pckt *tmp_pckt = (struct r_pckt *) buf; 

的BUF變量是指針類型和已指向經由malloc的分配的內存。拿它的地址給出你的數據地址的內存地址。

編輯: 還修復結構聲明按照邁克爾的職位,你會被設置。