C++ got pointer instead of value -
i wondering why pointer value (324502) in var signallengthdebugvar1 instead of expected integer value (2)?
struct shmlengthofsignalname { int signallength; }; //... byte* pbuf = null; //... int main(void){ //... pbuf = (byte*) mapviewoffile(hmapfile, file_map_all_access, 0, 0, buf_size); //... jobasignal sig1; printf("value signallength: %d \r\n", pbuf[30]); // 2 const shmlengthofsignalname * signalnamelengthptr = (const shmlengthofsignalname *)(pbuf + 30); int signallengthdebugvar1 = signalnamelengthptr->signallength; // content: 324502 maybe pointer? int signallengthdebugvar2 = (int) pbuf[30]; // content 2 sig1.setnamelength(signallengthdebugvar2); }
when print value, you're reading single byte @ pbuf + 30
:
// takes pbuf[30], converts byte's value int, , prints printf("value signallength: %d \r\n", pbuf[30]); // 2
later, when cast pointer , dereference it, you're accessing a full int, sizeof(int)
bytes (likely 4). occupies not byte @ pbuf + 30
subsequent bytes @ pbuf + 31
, etc., sizeof(int)
on platform. interprets these bytes according platform's byte-endianness (little-endian intel, big-endian other platforms).
// signallength struct member int int signallengthdebugvar1 = signalnamelengthptr->signallength; // content: 324502 maybe pointer?
note compiler permitted add padding before or after loation of signallength
field. in other words, can't assume signallength
start @ struct offset zero, unless use extern "c"
or compiler-specific #pragma
. , then, can't control endianness interpretation, if data encoded big-endian , you're on little-endian machine x86, value see wrong.
the bottom line in c++ not safe way decode binary data.
Comments
Post a Comment