2011-03-30 24 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的分配的内存。拿它的地址给出你的数据地址的内存地址。

编辑: 还修复结构声明按照迈克尔的职位,你会被设置。