Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy short is stored as 4 bytes in a struct in C?
    primarykey
    data
    text
    <p>I have the following two structs:</p> <p>The problem is the sizeof(Content) returns 160. The struct consists of 11 shorts, 6 ints, 76 chars, 7 floats, 1 double, totally adding to 158 bytes. I have counted three times and there is still a 2 byte difference.</p> <pre><code>typedef struct TIME_T { short year,mon,day; short hour,min,sec; } TIME; typedef struct { int no; char name[20]; char Code[10]; char DASType[10]; short wlen; float VLtd; int samp; int comp; int locationID; short TranMode; char TranIns[12]; short TimerMode; char ClkType[12]; float ClkErr; float lat; float lon; float alt; float azimuth,incident; short weight; short veloc; int oritype; char seismometer[12]; double sens; TIME start_time; int record_samples; } Content; </code></pre> <p>I write a small piece of code to print the position of each variables in the struct, and suddenly I find the <code>float wlen</code> takes 4 bytes. My code is as follows:</p> <pre><code>int main(void) { Content content; printf("Sizeof Content: %d\n", sizeof(content)); printf("Sizeof int content.no: %d\n", (int)&amp;content.name - (int)&amp;content.no); printf("Sizeof char[20] content.name: %d\n", (int)&amp;content.Code - (int)&amp;content.name); printf("Sizeof char[10] content.Code: %d\n", (int)&amp;content.DASType - (int)&amp;content.Code); printf("Sizeof char[10] content.DASType: %d\n", (int)&amp;content.wlen - (int)&amp;content.DASType); printf("Sizeof short content.wlen: %d\n", (int)&amp;content.VLtd - (int)&amp;content.wlen); printf("Sizeof float content.VLtdL %d\n", (int)&amp;content.samp - (int)&amp;content.VLtd); printf("Sizeof int content.samp: %d\n", (int)&amp;content.comp - (int)&amp;content.samp); printf("Sizeof int content.comp: %d\n", (int)&amp;content.locationID - (int)&amp;content.comp); printf("Sizeof int content.locationID: %d\n", (int)&amp;content.TranMode - (int)&amp;content.locationID); printf("Sizeof short content.TranMode: %d\n", (int)&amp;content.TranIns - (int)&amp;content.TranMode); printf("Sizeof char[12] content.TranIns: %d\n", (int)&amp;content.TimerMode - (int)&amp;content.TranIns); printf("Sizeof short content.TimerMode: %d\n", (int)&amp;content.ClkType - (int)&amp;content.TimerMode); printf("Sizeof char[12] content.ClkType: %d\n", (int)&amp;content.ClkErr - (int)&amp;content.ClkType); printf("Sizeof float content.ClkErr: %d\n", (int)&amp;content.lat - (int)&amp;content.ClkErr); printf("Sizeof float content.lat: %d\n", (int)&amp;content.lon - (int)&amp;content.lat); printf("Sizeof floatcontent.lon: %d\n", (int)&amp;content.alt - (int)&amp;content.lon); printf("Sizeof floatcontent.alt: %d\n", (int)&amp;content.azimuth - (int)&amp;content.alt); printf("Sizeof floatcontent.azimuth: %d\n", (int)&amp;content.incident - (int)&amp;content.azimuth); printf("Sizeof floatcontent.incident: %d\n", (int)&amp;content.weight - (int)&amp;content.incident); printf("Sizeof short content.weight: %d\n", (int)&amp;content.veloc - (int)&amp;content.weight); printf("Sizeof short content.veloc: %d\n", (int)&amp;content.oritype - (int)&amp;content.veloc); printf("Sizeof int content.oritype: %d\n", (int)&amp;content.seismometer - (int)&amp;content.oritype); printf("Sizeof char[12] content.seismometer: %d\n", (int)&amp;content.sens - (int)&amp;content.seismometer); printf("Sizeof double content.sens: %d\n", (int)&amp;content.start_time - (int)&amp;content.sens); printf("Sizeof TIME content.start_time: %d\n", (int)&amp;content.record_samples - (int)&amp;content.start_time); printf("Sizeof int content.record_samples: %d\n", sizeof(content.record_samples)); getchar(); return 0; } </code></pre> <p>The output is as follows:</p> <pre><code>Sizeof int content.no: 4 Sizeof char[20] content.name: 20 Sizeof char[10] content.Code: 10 Sizeof char[10] content.DASType: 10 Sizeof short content.wlen: 4 **Sizeof float content.VLtdL 4** Sizeof int content.samp: 4 Sizeof int content.comp: 4 Sizeof int content.locationID: 4 Sizeof short content.TranMode: 2 Sizeof char[12] content.TranIns: 12 Sizeof short content.TimerMode: 2 Sizeof char[12] content.ClkType: 12 Sizeof float content.ClkErr: 4 Sizeof float content.lat: 4 Sizeof floatcontent.lon: 4 Sizeof floatcontent.alt: 4 Sizeof floatcontent.azimuth: 4 Sizeof floatcontent.incident: 4 Sizeof short content.weight: 2 Sizeof short content.veloc: 2 Sizeof int content.oritype: 4 Sizeof char[12] content.seismometer: 12 Sizeof double content.sens: 8 Sizeof TIME content.start_time: 12 Sizeof int content.record_samples: 4 </code></pre> <p>The compiler is MSVC8, no UNICODE defined, no other macro defined. It's x86.</p> <p>I tried to compile the same code in gcc version 3.4.4, the output is the same. <code>Sizeof short content.wlen: 4</code></p> <p>Can anyone explain this to me?</p> <p>Thanks in advance.</p> <p><strong>EDIT:</strong> Thanks for answering! I have got it now.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload