1. 程式人生 > >C/C++結構體儲存

C/C++結構體儲存

 本文所採用的環境是WIN7-64位,VC++6.0
在本環境中資料型別所佔用的位元組數如下


char    1B
int     4B
short   2B
double  8B

 我們定義的兩個結構體如下:

#include <stdio.h>
typedef struct 
{
    short a;
    int   b;
    char  c;
}first;

typedef struct
{
    int   e;
    short d;
    char  b;    
}second;

> 在first結構體中,short型別在第一位,int在第二位,並且int型別在此結構體成員中所佔的空間最大,因此此結構體中所有成員變數都要與這個所佔空間最大的型別對齊,故都為4B,因此第一個結構體所佔的總空間為12B,總空間浪費了5B(12B-2B-4B-1B).
>第second結構體中,int型別在第一位,所以後面的應該按第一位的對齊,但是由於後面的型別所佔的空間都比int少,short佔了來兩位元組後,4B的空間還剩2B,因此後面的char型別依舊可以填到這個剩餘的2個位元組中,總空間只浪費了1B(8B-4B-2B-1B).

 驗證



void main()
{
    first a;
    second b;
    printf("sizeof(a) = %d,sizeof(b) = %d\n",sizeof(a),sizeof(b));
}


#include<stddef.h>中的offsetof來檢視變數的位置

結構體中帶有陣列的情況


它的儲存結構如下圖所示



結構體中帶有別的結構體的情況



它的儲存結構如下圖所示