結(jié)構(gòu)體內(nèi)存分析以及指向結(jié)構(gòu)體的指針

1.結(jié)構(gòu)體內(nèi)存分析

  • 1.結(jié)構(gòu)體存儲(chǔ)原理
    • 內(nèi)存是以字節(jié)為單位編號(hào),但一些硬件平臺(tái)對(duì)某些特定類型的數(shù)據(jù)只能從某些特定地址開(kāi)始, 比如從偶地址開(kāi)始。若不按照適合其平臺(tái)的要求對(duì)數(shù)據(jù)存放進(jìn)行對(duì)齊,會(huì)影響到效率。 因此,在內(nèi)存中,各類型的數(shù)據(jù)是按照一定的規(guī)則在內(nèi)存中存放的,這就是對(duì)齊問(wèn)題。
    • 結(jié)構(gòu)體占用的內(nèi)存空間是每個(gè)成員占用的字節(jié)數(shù)之和(考慮對(duì)齊問(wèn)題)
  • 2.結(jié)構(gòu)體變量占用存儲(chǔ)空間大小

注:定義結(jié)構(gòu)體類型不分配存儲(chǔ)空間,定義變量時(shí)才分配存儲(chǔ)空間

  • 規(guī)則一:找到結(jié)構(gòu)體中占用字節(jié)數(shù)最大的類型,假設(shè)其占用的字節(jié)數(shù)為8,每次開(kāi)辟新的存儲(chǔ)空間都增加8.
  • 規(guī)則二:結(jié)構(gòu)體中每條數(shù)據(jù)按定義類型時(shí)的順序存儲(chǔ),一條數(shù)據(jù)能存的下就往里存,存不下就開(kāi)辟新的內(nèi)存空間
??:
#include <stdio.h>
int main(int argc, const char * argv[]) {
//定義結(jié)構(gòu)體類型,這里的結(jié)構(gòu)體類型Person中,占用字節(jié)數(shù)最大的數(shù)據(jù)類型為double(64位編譯器下占用8個(gè)字節(jié)),在存儲(chǔ)score、height、age時(shí),存儲(chǔ)空間不夠的情況下,每次都會(huì)新開(kāi)辟8個(gè)字節(jié).
/*
struct Person {
        short score;
        int age;
        double height;
    };
//定義結(jié)構(gòu)體變量
    struct Person sp = {99,18,178.0};
    printf("調(diào)整順序前------%lu\n",sizeof(sp));
*/
//調(diào)整結(jié)構(gòu)體類型數(shù)據(jù)的順序
struct Person {
        short score;
        double height;
        int age;
    };
   struct Person sp = {99,178.0,18};
    printf("調(diào)整順序后------%lu\n",sizeof(sp));
    return 0;
}
//輸出:
調(diào)整順序前------16
調(diào)整順序后------24

存儲(chǔ)空間大小不同的原因與結(jié)構(gòu)體數(shù)據(jù)的順序有關(guān),例子中,最關(guān)鍵的是第二個(gè)數(shù)據(jù)的存儲(chǔ),調(diào)整前第二個(gè)數(shù)據(jù)為int類型,由于變量存儲(chǔ)時(shí)一次開(kāi)辟sizeof(double) = 8;short占用了其中的兩個(gè)字節(jié),剩余的6個(gè)字節(jié)能夠存儲(chǔ)int的4個(gè)字節(jié),所以不會(huì)開(kāi)辟新的存儲(chǔ)空間,而調(diào)整后第二個(gè)數(shù)據(jù)為double,剩余的6個(gè)字節(jié)不夠存儲(chǔ)double,所以開(kāi)辟了新的存儲(chǔ)空間8個(gè)字節(jié).所以調(diào)整前存儲(chǔ)一個(gè)結(jié)構(gòu)體變量需要16個(gè)字節(jié),而調(diào)整后需要24個(gè)字節(jié)

2.指向結(jié)構(gòu)體變量的指針

      // 定義一個(gè)結(jié)構(gòu)體類型
      struct Student {
          char *name;
          int age;
      };

     // 定義一個(gè)結(jié)構(gòu)體變量
     struct Student stu = {“sj", 25};

     // 定義一個(gè)指向結(jié)構(gòu)體的指針變量
     struct Student *p;

    // 指向結(jié)構(gòu)體變量stu
    p = &stu;

     /*
      這時(shí)候可以用3種方式訪問(wèn)結(jié)構(gòu)體的成員
      */
     // 方式1:結(jié)構(gòu)體變量名.成員名
     printf("name=%s, age = %d \n", stu.name, stu.age);

     // 方式2:(*指針變量名).成員名
     printf("name=%s, age = %d \n", (*p).name, (*p).age);

     // 方式3:指針變量名->成員名
     printf("name=%s, age = %d \n", p->name, p->age);

     return 0; 
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,309評(píng)論 2 89
  • 1. 基礎(chǔ)知識(shí) 1.1、 基本概念、 功能 馮諾伊曼體系結(jié)構(gòu)1、計(jì)算機(jī)處理的數(shù)據(jù)和指令一律用二進(jìn)制數(shù)表示2、順序執(zhí)...
    yunpiao閱讀 5,800評(píng)論 1 22
  • 很多親都會(huì)跟我說(shuō),我皮膚薄,特別敏感,容易過(guò)敏,還有紅血絲。特別怕用護(hù)膚品!不知道要選擇什么樣的護(hù)膚品,試過(guò)好多護(hù)...
    蘇醒護(hù)膚老師閱讀 386評(píng)論 0 0
  • 我傷害她的那天是愚人節(jié)。 那天,已進(jìn)入春季的北方,突然飄起了鵝毛大雪。我仰頭站在一片蒼茫之中,任漫天飛舞的精靈親吻...
    克里希那靜修閱讀 671評(píng)論 0 31

友情鏈接更多精彩內(nèi)容