是否可以将char *转换为结构?

时间:2011-03-30 20:08:18

标签: c udp

这是我的问题,rcvfrom()参数之一是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;

它不起作用。有任何想法吗? 感谢。

4 个答案:

答案 0 :(得分:10)

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;

答案 1 :(得分:1)

r_pckt不是结构名称,而是变量名称。尝试

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

是的,马克是对的,你不需要&那里。

P.S。实际上,当“它不起作用”时,它还会为您提供值得阅读的有意义的错误消息。

答案 2 :(得分:1)

你需要删除&在演员。并且(正如其他人已经指出的那样),您在结构定义和变量声明方面存在不一致。我认为大多数编译器会抓住它,所以我怀疑在发布问题时出现了剪切错误。

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

答案 3 :(得分:0)

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

应该是:

r_pckt *tmp_pckt = (struct r_pckt *) buf;

buf变量是指针类型,并且已经指向通过malloc分配的内存。取它的地址可以得到保存数据地址的存储器地址。

编辑: 还要按照迈克尔的帖子修改结构声明,你就可以了。