| | |
sizeof() for a Structure
Please support our C++ advertiser: Intel Parallel Studio Home
![]() |
Here is my code :
I'm using Dev-CPP compiler.
Output is 56, but it must be 54.
Any explanation and solutions?
•
•
•
•
#include <iostream.h>
int main (int argc, char * argv[])
{struct}
{short Signture;} Header;
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;
cout<<"Size of Header = "<<sizeof(Header)<<endl;
system("PAUSE>nul");
return EXIT_SUCCESS;
Output is 56, but it must be 54.
Any explanation and solutions?
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.
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.
•
•
•
•
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() ?
Look into your compiler's documentation for a way to pack structures.
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
•
•
•
•
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?
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
Thanx Dave, you are very kind...
I made some test on my code. Here is a sample :
The output is :
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.
I made some test on my code. Here is a sample :
•
•
•
•
#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;
}
•
•
•
•
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 ─
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.
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.]
[And I won't open attached .doc files.]
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
![]() |
Similar Threads
Other Threads in the C++ Forum
- Previous Thread: newcommer to c++ need help with simple program
- Next Thread: Special calculator help
| Thread Tools | Search this Thread |
api array arrays based binary c++ c/c++ calculator char char* class classes code coding compile console conversion convert count database delete deploy desktop developer directshow dll download dynamic dynamiccharacterarray email encryption error file forms fstream function functions game givemetehcodez google graph gui homeworkhelp iamthwee ifstream input int java lib linkedlist linker linux list loop looping loops map math matrix memory multiple news number numbertoword output pointer problem program programming project python random read recursion recursive reference return rpg sorting string strings temperature template templates test text text-file tree unix url variable vector video visual visualstudio win32 windows winsock wordfrequency wxwidgets






