943,967 Members | Top Members by Rank

Ad:
  • C++ Discussion Thread
  • Unsolved
  • Views: 32675
  • C++ RSS
Jul 28th, 2005
0

sizeof() for a Structure

Expand Post »
Here is my code :
Quote ...
#include <iostream.h>

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 NumbOfPix;
long Compression;
long SizeOfImgData;
long HRes;
long VRes;
long NumOfCol;
long NumOfImpCol;
} Header;

cout<<"Size of Header = "<<sizeof(Header)<<endl;

system("PAUSE>nul");
return EXIT_SUCCESS;
}
I'm using Dev-CPP compiler.
Output is 56, but it must be 54.

Any explanation and solutions?
Similar Threads
Reputation Points: 13
Solved Threads: 1
Junior Poster in Training
AhmedHan is offline Offline
71 posts
since Apr 2005
Jul 28th, 2005
0

Re: sizeof() for a Structure

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.
Reputation Points: 68
Solved Threads: 18
Posting Pro in Training
winbatch is offline Offline
466 posts
since Feb 2005
Jul 28th, 2005
0

Re: sizeof() for a Structure

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() ?
Reputation Points: 13
Solved Threads: 1
Junior Poster in Training
AhmedHan is offline Offline
71 posts
since Apr 2005
Jul 28th, 2005
0

Re: sizeof() for a Structure

Quote originally posted by AhmedHan ...
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() ?
What sizeof tells you is the truth.

Look into your compiler's documentation for a way to pack structures.
Team Colleague
Reputation Points: 2780
Solved Threads: 312
long time no c
Dave Sinkula is offline Offline
4,790 posts
since Apr 2004
Jul 28th, 2005
0

Re: sizeof() for a Structure

Quote originally posted by Dave Sinkula ...
Look into your compiler's documentation for a way to pack structures.
What do you mean by packing structures?

Are there any gaps between variables in a structure? If so, how can we avoid them?
Reputation Points: 13
Solved Threads: 1
Junior Poster in Training
AhmedHan is offline Offline
71 posts
since Apr 2005
Jul 28th, 2005
0

Re: sizeof() for a Structure

Quote originally posted by AhmedHan ...
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?
Team Colleague
Reputation Points: 2780
Solved Threads: 312
long time no c
Dave Sinkula is offline Offline
4,790 posts
since Apr 2004
Jul 29th, 2005
0

Re: sizeof() for a Structure

Thanx Dave, you are very kind...

I made some test on my code. Here is a sample :
Quote ...
#include <iostream.h>
#include <memory.h>

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 = "<<sizeof(Header)<<endl;

for(int i=0; i<60; i++) cout<<i<<"\t"<<Ptr.CPtr[i]<<endl;

system("PAUSE>nul");
return EXIT_SUCCESS;
}
The output is :
Quote ...
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.
Attached Files
File Type: doc Forum.doc (43.5 KB, 205 views)
Reputation Points: 13
Solved Threads: 1
Junior Poster in Training
AhmedHan is offline Offline
71 posts
since Apr 2005
Jul 29th, 2005
0

Re: sizeof() for a Structure

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.]
Team Colleague
Reputation Points: 2780
Solved Threads: 312
long time no c
Dave Sinkula is offline Offline
4,790 posts
since Apr 2004
Jun 8th, 2010
-2

its correct

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
Reputation Points: 9
Solved Threads: 0
Newbie Poster
bala2nd is offline Offline
1 posts
since May 2010

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
This thread is currently closed and is not accepting any new replies.
Previous Thread in C++ Forum Timeline: Duplicates in 2d vector of 3d points
Next Thread in C++ Forum Timeline: a simple way to print a binary representation of a floating point number?





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC