2014-01-16 3 views
0

Так я структура создана как такКопирование начиная со смещения в начале структуры

EDIT: PLAYERCOORDS = 1, определяется в начале моего кода

struct PLAYERCOORDINATESSTRUCT 
{ 
    int type, x, y; 
    bool isalive; 
    bool isconnected; 
    PLAYERCOORDINATESSTRUCT(int customx, int customy, bool customisalive, bool customisconnected) 
    { 
     type=(PLAYERCOORDS); 
     x = customx; 
     y = customy; 
     isalive = customisalive; 
     isconnected = customisconnected; 
    } 
    PLAYERCOORDINATESSTRUCT() 
    { 
     type=(PLAYERCOORDS); 
    } 
}; 

char* bufferwithstructdata = new char[sizeof(PLAYERCOORDINATESSTRUCT)-4]; 
//-4 since it's missing first int 
PLAYERCOORDINATESSTRUCT testdata; 
memcpy(&testdata,bufferwithstructdata,sizeof(PLAYERCOORDINATESSTRUCT)-4) 

У меня есть символ буфер, который хранит всю информацию для одной из этих структур, за исключением типа int (первые 4 байта структуры)

Я пытаюсь выяснить, как правильно memcpy это использовать источник со смещением. Я обнаружил, что мне нужно иметь 4 байта от адреса структуры, чтобы начать с int x. Тем не менее, я обнаружил, что когда я попытался добавить 4 к адресу, выполнив (& testdata + 4), он вместо этого добавил 40 к адресу! Кто-нибудь знает, как я могу memcpy со смещением 4 байта в структуру, или способ, которым я мог бы просто смещать адрес на 4 байта вместо 10 за раз?

Большое спасибо за чтение.

ответ

3

Что вы хотите следующее:

memcpy(((char*)&testdata)+4, bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 

Причина в том, что оператор + применяется к указателям добавляет целочисленные указанный раз размер вещи быть указал. Вот почему добавление 4 добавило 40 к адресу. Кастинг для символа * перед добавлением 4 добавит 4 байта. Кроме того, если вы хотите что-то немного более портативный, следующий будет хороший трюк, чтобы делать то, что вы хотите:

memcpy(((int*)&testdata)+1, bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 

Это имеет преимущество добавления единицы размера один целочисленный по адресу, независимо от размера int.

Как Lalaland отметил, что было бы еще лучше использовать offsetof так:

memcpy(offsetof(PLAYERCOORDINATESSTRUCT, x), bufferwithstructdata, sizeof(PLAYERCOORDINATESSTRUCT)-4); 
+0

Большое вам спасибо CrazyCasta! Я был настолько потрясен XD – user2980207

+0

[offsetof] (http://en.cppreference.com/w/cpp/types/offsetof) мог бы сделать этот код более переносимым (и более простым для чтения). – Lalaland

Смежные вопросы