(一) 內存佔用規則
首先定義一個簡單的結構體,包含四種常用的結構類型。其中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));