溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

內(nèi)存對(duì)齊模式與結(jié)構(gòu)體

發(fā)布時(shí)間:2020-06-17 06:53:47 來(lái)源:網(wǎng)絡(luò) 閱讀:473 作者:匯天下豪杰 欄目:編程語(yǔ)言

1、結(jié)構(gòu)體是一種新的數(shù)據(jù)類型,對(duì)C語(yǔ)言的數(shù)據(jù)類型進(jìn)行了極大的擴(kuò)充。

  struct STU{

   int age;

   char name[15];

  };

  struct STU  a;   //結(jié)構(gòu)體實(shí)例

  struct STU  *b;  //結(jié)構(gòu)體指針

  (1).可以通過(guò)a.age對(duì)其進(jìn)行取成員的操作,b->age也可以進(jìn)行結(jié)構(gòu)體的操作。

  b->age存在問(wèn)題,必須有一個(gè)結(jié)構(gòu)體空間已經(jīng)讓b指向,b的值為此結(jié)構(gòu)體空間的地址。

  (2).a.name = "lilei"; false,因?yàn)閚ame是數(shù)組名稱,指針常量不能賦值,解決方案:strcpy()函數(shù);

  (3).字符串直接進(jìn)行比較的話,是其地址的比較,沒(méi)有什么意義,用strcmp()函數(shù)進(jìn)行比較,就是ASCII碼的比較了。

2、內(nèi)存對(duì)齊模式:

  操作系統(tǒng)對(duì)于內(nèi)存空間的分配,遵循如下原則:總是從2^n倍數(shù)為地址的字節(jié)處開(kāi)始分配空間

  如:若按4B對(duì)其模式的話,則每個(gè)變量(結(jié)構(gòu)體成員)的首地址總是從編號(hào)為4的整數(shù)倍的字節(jié)處開(kāi)始分配空間。

  可設(shè)幾字節(jié)對(duì)齊如下:

  #pragma pack(push)    //保持原對(duì)齊格式

  #pragma pack(1)      //設(shè)定為n字節(jié)格式


  .......

  #pragma pack(pop)     //恢復(fù)為原對(duì)齊格式

3、結(jié)構(gòu)體大小:

  (1).總大小是下一個(gè)類型的整數(shù)倍,否則用單字節(jié)補(bǔ)齊(單字節(jié)最多補(bǔ)到4/8,具體看結(jié)構(gòu)體中最寬幾字節(jié)      //總大小指的是前面字節(jié)總數(shù)和當(dāng)前的字節(jié)數(shù)之和。

  (2).結(jié)構(gòu)體大小是最寬字節(jié)的整數(shù)倍(一般情況下為4或8)

  (3).上述兩個(gè)條件必須同時(shí)成立。若最終結(jié)果不成立的話,則補(bǔ)齊整數(shù)倍即可。

4、下面舉例論證結(jié)構(gòu)體大?。?/span>

  (1). struct TEST{

     int a;

     short b;

     char c;

     struct TEST *next;

   };

  分析如下:4->2->1 (補(bǔ)1字節(jié))->4   共12字節(jié)。

內(nèi)存對(duì)齊模式與結(jié)構(gòu)體

    

  (2).借用一中的結(jié)構(gòu)體

  struct TEST1{

   short d;

   int e;

   char f;

   struct TEST g;

   struct TEST1 *next;

   struct TEST h;

   char i;

  };

  分析如下:2(補(bǔ)2字節(jié))->4->1(補(bǔ)3字節(jié))->12->4(想補(bǔ)也不能補(bǔ),最多補(bǔ)到最寬單字節(jié),在這最多到4字節(jié),已經(jīng)為4字節(jié)了,所以不能在補(bǔ)了)->12->1

  一共為:41字節(jié),但是結(jié)構(gòu)體大小為最寬單字節(jié)的整數(shù)倍,在這應(yīng)為4的整數(shù)倍。

  最終,此結(jié)構(gòu)體大小為44字節(jié)。

內(nèi)存對(duì)齊模式與結(jié)構(gòu)體   

   

  (3).借用一中的結(jié)構(gòu)體

  struct TEST2{

   short d;

   int e;

   double f;

   struct TEST1 *next;

   struct TEST g;

   char i;

  };

  分析如下:2(補(bǔ)2字節(jié))->4->8->4(補(bǔ)4字節(jié):前面一共16字節(jié),當(dāng)前4字節(jié),所以總共20字節(jié),不是下一個(gè)數(shù)據(jù)類型(12)的整數(shù)倍,且最寬為8字節(jié),可補(bǔ)4字節(jié),構(gòu)成整數(shù)倍)->12->1

  一共為37字節(jié),但是結(jié)構(gòu)體大小為最寬單字節(jié)的整數(shù)倍,在這應(yīng)為8的整數(shù)倍。

  最終此結(jié)構(gòu)體大小為40字節(jié)

內(nèi)存對(duì)齊模式與結(jié)構(gòu)體


結(jié)構(gòu)體類型極大的擴(kuò)充了C語(yǔ)言,是數(shù)據(jù)類型更加豐富多彩!


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI