Можно ли привести char * к структуре? - PullRequest
4 голосов
/ 31 марта 2011

Вот моя проблема, один из параметров 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 ]

10 голосов
/ 31 марта 2011
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 голос
/ 31 марта 2011

Вам необходимо удалить & в актерском составе.И (как уже отмечалось) у вас есть несоответствие в определении структуры и объявлении переменной.Я думаю, что большинство компиляторов поймут это, поэтому я подозреваю, что при публикации вопроса возникла ошибка «вырезать и вставить».

struct r_pckt *tmp_pckt = (struct r_pckt *) buf;
1 голос
/ 31 марта 2011

r_pckt - это не имя структуры, а имя переменной.Попробуйте

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

И да, Марк прав, вам не нужно и нет.

PS На самом деле, когда "это не работает", он также предоставляет вам значимые сообщения об ошибках, которыеСтоит прочитать.

0 голосов
/ 31 марта 2011
r_pckt *tmp_pckt = (struct r_pckt *) &buf;

должно быть:

r_pckt *tmp_pckt = (struct r_pckt *) buf;

Переменная buf является типом указателя и уже указывает на память, выделенную через malloc. Взяв его адрес, вы получите адрес памяти, содержащей адрес ваших данных.

редактирование: Также исправьте объявление структуры согласно сообщению Майкла, и вы будете установлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...