Re: Problem with char type in structures (MSVC)

From: David Hilsee (davidhilseenews_at_yahoo.com)
Date: 08/28/04


Date: Sat, 28 Aug 2004 11:58:06 -0400


"h79" <h79@interia.pl> wrote in message
news:90dc8bec.0408280425.39c82e38@posting.google.com...
> Hi everyone.
>
> I've got a little problem...
> I'll try illustrate it on example.
>
> ////////////
> typedef unsigned long DWORD;
> typedef unsigned char BYTE;
>
> struct TST
> {
> BYTE a, b, c;
> DWORD d;
> };
>
> int main()
> {
> ifstream *h_in;
> TST s_tst;
>
> h_in = new ifstream("tst.bin", ios::in | ios::binary |
> ios::nocreate);
> h_in->read((char*)&s_tst, sizeof(TST));
> // 004010F0 6A 08 push 8 ; <- why 8, not 7 ?
> // 004010F2 8D 45 E8 lea eax,[ebp-18h]
> // 004010F5 50 push eax
> // 004010F6 8B 4D F0 mov ecx,dword ptr [ebp-10h]
> // 004010F9 E8 32 0A 00 00 call istream::read
> (00401b30)
>
> cout << hex << (int)s_tst.a << endl;
> // printed: '1' <- OK
> cout << hex << (int)s_tst.b << endl;
> // printed: '2' <- OK
> cout << hex << (int)s_tst.c << endl;
> // printed: '3' <- OK
> cout << hex << s_tst.d << endl;
> // printed: 'cc000000' <- ERROR: should be '4'
>
> delete h_in;
> return 0;
>
> }
>
> //////////////
>
> Below is the body of file 'tst.bin':
>
> 00000000|01 02 03 04-00 00 00
>
> It's length is equal to 7.
>
> Questions are:
> 1) Why offset of 'd' member i structure 'TST' is equal to 4, not 3?
> 2) What add in source code or change in project settings to fix it
> (i.e. offset of 'd' member be equal 3)?
>
> I want add that this problem apear in MSVC++, but doesn't apear in
> Borland C++ compiler where builded program work fine.

The compiler may insert padding in structs to align the members properly.
If you want to change the compiler's behavior, consult its documentation or
a more appropriate newsgroup that discusses your compiler. I wouldn't
bother to change the compiler's settings, because changing the code would be
an easy solution that wouldn't require revisiting this problem later on
other compilers.

h_in->read((char*)&s_tst, sizeof(TST));

// Read each member instead
h_in->read((char*)&s_tst.a, sizeof(BYTE));
h_in->read((char*)&s_tst.b, sizeof(BYTE));
h_in->read((char*)&s_tst.c, sizeof(BYTE));
h_in->read((char*)&s_tst.d, sizeof(DWORD));

-- 
David Hilsee


Relevant Pages

  • Re: Pls--Need help with Hellow World! with MS Visual C++ 6.0
    ... but that compiler is preset to ... I'ld suggest disabling precompiled headers in the ... his source elsewhere (or bring some source code from ...
    (microsoft.public.vc.language)
  • Re: Fixing the Compiler Warning Message C4146:
    ... It is fairly safe to assume that such examples from textbooks are always erroneous. ... DWORD w = -n; ... and the compiler rightly complains that the code makes no sense. ... and this worked fine until Win64 came around, and the API is now specified as ...
    (microsoft.public.vc.mfc)
  • Re: CreateRemoteThread
    ... I'm just trying to have the thread sleep for a ... static DWORD WINAPI Test() ... WriteProcessMemory(hProcess, pCodeRemote, &Test, 1024, NULL); ... compiler has linked your program together. ...
    (microsoft.public.win32.programmer.kernel)
  • Re: Unexpected behavior in VC
    ... via memory mapped access. ... be dword accesses. ... xxxxxx00 B8000000F0 mov eax,0F0000000h ... the compiler generates the 'correct' code. ...
    (microsoft.public.vc.language)
  • Re: IMA ADPCM nBlockAlign (still need help)
    ... I'm needing to assign a value to nBlockAlign, not check the value, so I'm ... a multiple of a DWORD, still not the definitive answer I'm looking for:^( ... > source code for the IMA ADPCM codec. ...
    (microsoft.public.win32.programmer.directx.audio)