954,496 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

sizeof() for a Structure

Here is my code :
#include

int main (int argc, char * argv[])
{[INDENT] struct
{[INDENT] short Signture;
long FileSize;
short Reserved1;
short Reserved2;
long ImgDataStartOff;
long InfoHeaderSize;
long Width;
long Height;
short Planes;
short NumbOfPix;
long Compression;
long SizeOfImgData;
long HRes;
long VRes;
long NumOfCol;
long NumOfImpCol;[/INDENT] } Header;

cout<<"Size of Header = "<nul");
return EXIT_SUCCESS;[/INDENT]}
I'm using Dev-CPP compiler.
Output is 56, but it must be 54.

Any explanation and solutions?

AhmedHan
Junior Poster in Training
71 posts since Apr 2005
Reputation Points: 13
Solved Threads: 1
 

I found this:

http://www.eskimo.com/~scs/C-faq/q2.13.html

and this:

9.10: Why does sizeof report a larger size than I expect for a structure type, as if there was padding at the end?

Structures may have this padding (as well as internal padding; see also question 9.5 ), so that alignment properties will be preserved when an array of contiguous structures is allocated.

winbatch
Posting Pro in Training
466 posts since Feb 2005
Reputation Points: 68
Solved Threads: 18
 

So, is that the fault of sizeof() or the structure really holds 56 bytes?

I am gonna use this structure to gether the header of a bitmap file. My question is, am I gonna get 54 bytes or 56 bytes by a file stream function such as .read() ?

AhmedHan
Junior Poster in Training
71 posts since Apr 2005
Reputation Points: 13
Solved Threads: 1
 

So, is that the fault of sizeof() or the structure really holds 56 bytes?

I am gonna use this structure to gether the header of a bitmap file. My question is, am I gonna get 54 bytes or 56 bytes by a file stream function such as .read() ?

Whatsizeof tells you is the truth.

Look into your compiler's documentation for a way to pack structures.

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 
Look into your compiler's documentation for a way to pack structures.


What do you mean bypacking structures?

Are there any gaps between variables in a structure? If so, how can we avoid them?

AhmedHan
Junior Poster in Training
71 posts since Apr 2005
Reputation Points: 13
Solved Threads: 1
 

What do you mean by packing structures?

Are there any gaps between variables in a structure? If so, how can we avoid them?

I take it you didn't follow the link that already answered this question, nor did you take my advice about checking your compiler's documentation. Why ask for help and ignore the replies?

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

Thanx Dave, you are very kind...

I made some test on my code. Here is a sample :
#include
#include

int main (int argc, char * argv[])
{
struct
{
short Signture;
long FileSize;
short Reserved1;
short Reserved2;
long ImgDataStartOff;
long InfoHeaderSize;
long Width;
long Height;
short Planes;
short NumOfPix;
long Compression;
long SizeOfImgData;
long HRes;
long VRes;
long NumOfCol;
long NumOfImpCol;
} Header;

memset(&Header, 196, 75); //Fill the structure with '-' characters

Header.Signture =0x4241;
Header.FileSize =0x46454443;
Header.Reserved1 =0x4847;
Header.Reserved2 =0x4A49;
Header.ImgDataStartOff =0x4E4D4C4B;
Header.InfoHeaderSize =0x5251504F;
Header.Width =0x56555453;
Header.Height =0x5A595857;
Header.Planes =0x5C5B;
Header.NumOfPix =0x5E5D;
Header.Compression =0x6261605F;
Header.SizeOfImgData =0x66656463;
Header.HRes =0x6A696867;
Header.VRes =0x6E6D6C6B;
Header.NumOfCol =0x7271706F;
Header.NumOfImpCol =0x76757473;

union
{
char * CPtr;
short * SPtr;
} Ptr;

Ptr.SPtr = &Header.Signture;

cout<<"Size of Header = "<nul");
return EXIT_SUCCESS;
}

The output is :Size of Header = 56
0 A
1 B
2 ─
3 ─
4 C
5 D
6 E
7 F
8 G
9 H
10 I
11 J
12 K
13 L
14 M
15 N
16 O
17 P
18 Q
19 R
20 S
21 T
22 U
23 V
24 W
25 X
26 Y
27 Z
28 [
29 \
30 ]
31 ^
32 _
33 `
34 a
35 b
36 c
37 d
38 e
39 f
40 g
41 h
42 i
43 j
44 k
45 l
46 m
47 n
48 o
49 p
50 q
51 r
52 s
53 t
54 u
55 v
56 ─
57 ─
58 ─
59 ─

As it is seen, the gap is between the variables "Signture" and "FileSize". There is a 2 byte gap.

But I managed to solve my problem. I used pre-defined windows structures which I found on MSDN.

I attached a doc file; have a look at it.

Attachments Forum.doc (43.5KB)
AhmedHan
Junior Poster in Training
71 posts since Apr 2005
Reputation Points: 13
Solved Threads: 1
 

As mentioned in the links, there are ways to "pack" structures. There is no standard way, however, so each system may do it differently. One way might be #pragma pack . Then again it might not. Only your compiler's documentation will tell you (and you might want to mention which compiler you are using for the rest of us that can't see your computer).

[And I won't open attached .doc files.]

Dave Sinkula
long time no c
Team Colleague
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
 

that is correct frnd. u just try one more long double or double variable it will show even higher value. its bcoz struct wil allocate memory arrays in terms of the longest variable(member) (may be a double,long,etc.,.)of the struct.In your problem it will allocate arrays of contigous memory in terms of size of long.
if u hv any doubt just add one more short varible it will remain same and u add even more one the size wil increas by 4. just try........ these all r bcoz of ur os.
ans:
11*4=44
10 more required for int. but in terms of long type it will allocate memory>=10 that is 3*4=12 which is >=10.
tot=44+12=56

bala2nd
Newbie Poster
1 post since May 2010
Reputation Points: 9
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You