結構體的內存佔用及如何正確初始化

(一) 內存佔用規則

首先定義一個簡單的結構體,包含四種常用的結構類型。其中char佔用1字節、int佔用4字節、float佔用4字節、double佔8字節。

struct Coordinate  
    {  
        char x;  
        int y;  
        float z;  
        double t;  
    }

按照正常計算佔用的內存爲 1+4+4+8=17但是這不滿足struct變量的起始地址存儲規則,因此是錯的。

爲了使CPU能夠快速訪問,提高訪問效率,struct變量的起始地址存儲滿足以下規則:

 1.起始地址爲該變量類型所佔內存的整數倍,若不足則不足部分用數據填充至所佔內存的整數倍。

 2.該結構體所佔總內存爲結構體成員變量中最大數據類型的整數倍。

爲了滿足以上規則,存儲的大小應該爲 24。如下圖,白色部分爲變量所需的空間,紅色部分爲填充大小。


由於大小剛好爲24,忽略第二條。但是若在最後增加一個變量,又該如何存儲呢,程序如下:

struct Coordinate_1  
    {  
        char x;  
        int y;  
        float z;  
        double t;  
        char n;  
    };

前面部分不變,大小爲24,在最後加1,佔25字符,但是不滿足第二條規則,所以必須再填充3,佔28字符(4 * 7 = 28)。

(二)結構體的存儲空間分配

struct Coordinate  
    {  
        char x;  
        int y;  
        float z;  
        double t;  
    };

(1)在變量類型不一致時,在聲明結構體時利用構造函數直接對其初始化。

struct Coordinate()  
    {  
        x = 'a';  
        y = 0;  
        z = 0.0;  
        t = 0.0;  
    }  
    char x;  
    int y;  
    float z;  
    double t;  
};

(2)在一致時,利用calloc函數或memset函數進行初始化比較方便。

a) calloc 函數 

#include <malloc.h>  
struct Coordinate // 直角座標系  
{  
    double  X;  
    double  Y;  
    double  Z;  
    double  t;  
};  
struct Coordinate *a = (struct Coordinate *)calloc(3, sizeof(struct Coordinate));
b) memset 函數

在主函數中使用以下初始化即可

Coordinate *coor;
memset(coor, 0, sizeof(Coordinate));



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章