C語言中內存對齊與結構體

結構體

結構體是一種新的數據類型,對C語言的數據類型進行了極大的擴充。數組

struct STU{
  int age;
  char name[15];
 };

 struct STU  a;   //結構體實例
 struct STU  *b;  //結構體指針

一、能夠經過a.age對其進行取成員的操做,b->age也能夠進行結構體的操做,b->age存在問題,必須有一個結構體空間已經讓b指向,b的值爲此結構體空間的地址。
二、a.name = "lilei"; false,由於name是數組名稱,指針常量不能賦值,解決方案:strcpy()函數
三、字符串直接進行比較的話,是其地址的比較,沒有什麼意義,用strcmp()函數進行比較,就是ASCII碼的比較了。函數

內存對齊

操做系統對於內存空間的分配,遵循以下原則:老是從2^n倍數爲地址的字節處開始分配空間。
如:若按4B對其模式的話,則每一個變量(結構體成員)的首地址老是從編號爲4的整數倍的字節處開始分配空間。
可設幾字節對齊以下操作系統

#pragma pack(push)    //保持原對齊格式
#pragma pack(1)      //設定爲n字節格式

 .......
 
#pragma pack(pop)     //恢復爲原對齊格式

一、結構體大小
(1)、總大小是下一個類型的整數倍,不然用單字節補齊(單字節最多補到4/8,具體看結構體中最寬幾字節)
//總大小指的是前面字節總數和當前的字節數之和
(2)、結構體大小是最寬字節的整數倍(通常狀況下爲4或8)
(3)、上述兩個條件必須同時成立。若最終結果不成立的話,則補齊整數倍便可
二、下面舉例論證結構體大小
(1)、指針

struct TEST{
    int a;
    short b;
    char c;
    struct TEST *next;
};

分析以下:4->2->1 (補1字節)->4 共12字節
(2)、借用(1)中的結構體code

struct TEST1{
  short d;
  int e;
  char f;
  struct TEST g;
  struct TEST1 *next;
  struct TEST h;
  char i;
};

分析以下:2(補2字節)->4->1(補3字節)->12->4(想補也不能補,最多補到最寬單字節,在這最多到4字節,已經爲4字節了,因此不能在補了)->12->1。
一共爲:41字節,可是結構體大小爲最寬單字節的整數倍,在這應爲4的整數倍,最終,此結構體大小爲44字節。
(3)、借用(1)中的結構體內存

struct TEST2{
  short d;
  int e;
  double f;
  struct TEST1 *next;
  struct TEST g;
  char i;
};

分析以下:2(補2字節)->4->8->4(補4字節:前面一共16字節,當前4字節,因此總共20字節,不是下一個數據類型(12)的整數倍,且最寬爲8字節,可補4字節,構成整數倍)->12->1。
一共爲37字節,可是結構體大小爲最寬單字節的整數倍,在這應爲8的整數倍,最終此結構體大小爲40字節。
結構體類型極大的擴充了C語言,是數據類型更加豐富多彩。字符串

相關文章
相關標籤/搜索