Адрес структуры совпадает с адресом первого члена? - PullRequest
6 голосов
/ 13 февраля 2012

Считайте, что у меня есть Struct, как показано ниже:

struct Bitmask
{
  unsigned char payload_length: 7;
  unsigned char mask: 1;
  unsigned char opcode: 4;
  unsigned char rsv3: 1;
  unsigned char rsv2: 1;
  unsigned char rsv1: 1;
  unsigned char fin: 1;
};

const char* payload = "Hello";
const size_t payload_length = strlen(payload);

Bitmask* header = new Bitmask();
header->fin =1;
header->rsv1 = 0;
header->rsv2 = 0;
header->rsv3 = 0;
header->opcode = 1;
header->mask = 0;
header->payload_length = payload_length;

iovec iov[2];
iov[0].iov_base = (char*)header;
iov[0].iov_len = sizeof (header);
iov[1].iov_base = (char *)payload;
iov[1].iov_len = strlen(payload);

ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT ("iov[0].length = %d\niov[1].length = %d\n"),
            iov[0].iov_len,
            iov[1].iov_len));

size_t bytes_xfered;
client_stream_.sendv_n (iov, 2, 0, &bytes_xfered);

cout << "Transfered " << bytes_xfered << " byte(s)" << std::endl;

Я инициализирую его соответствующими значениями. Наконец, я хочу преобразовать структуру в char *, чтобы добавить свою полезную нагрузку (которая является сообщением char *) и отправить ее через соединение через веб-сокет.

Ответы [ 3 ]

14 голосов
/ 13 февраля 2012

Адрес структуры совпадает с адресом первого члена?

Да, на самом деле это предусмотрено стандартами C и C ++. Из стандарта С:

6.7.2.1-13. Указатель на объект структуры, соответствующим образом преобразованный, указывает на его начальный элемент

Размер вашего struct должен составлять два байта. Вы не должны преобразовывать указатель на него в char*, однако: вместо этого вы должны использовать memcpy, чтобы скопировать ваш Bitmask в буфер, который вы отправляете по сети.

РЕДАКТИРОВАТЬ Так как вы используете сборку ввода-вывода с iovec, вам не нужно приводить Bitmask к чему-либо: iov_base равно void*, поэтому вы можете просто установить iov[0].iov_base = header;

Примечание. Это работает только в том случае, если ваш struct не содержит виртуальных функций, базовых классов и т. Д. (Спасибо, Тимо).

EDIT2

Чтобы получить {0x81, 0x05} в вашем struct, вы должны изменить порядок элементов структуры следующим образом:

struct Bitmask {
    unsigned char opcode: 4; 
    unsigned char rsv3: 1; 
    unsigned char rsv2: 1; 
    unsigned char rsv1: 1; 
    unsigned char fin: 1; 
    unsigned char payload_length: 7; 
    unsigned char mask: 1;
}
1 голос
/ 13 февраля 2012

Адрес структуры совпадает с адресом ее первого члена, при условии, что используется соответствующее приведение.Учитывая приведенное ниже объявление struct my_struct, если item имеет тип struct

my_struct, then (char *)item == &item.wp_cval.


struct my_struct
{

      char wp_cval;
      short wp_font;
      short wp_psize;


}ar[ARSIZE];
1 голос
/ 13 февраля 2012

Да и нет.

В общем, это верно (как объясняет dasblinkenlight), но оно не распространяется на битовые поля.Согласно C ++ 11 9.6 / 3 «нет указателей на битовые поля», поэтому у них тоже нет адресов.И очевидно, что «указатель на объект структуры, соответствующим образом преобразованный , указывает на его начальный член», ломается, если нет «подходящего преобразования».

...