<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C語言中內(nèi)存四區(qū)的本質(zhì)分析

          共 3831字,需瀏覽 8分鐘

           ·

          2022-02-11 18:13

          素材來源 | 抖點料er


          1.1數(shù)據(jù)類型本質(zhì)分析

          1.1.1數(shù)據(jù)類型的概念

          ●“類型”是對數(shù)據(jù)的抽象
          ●類型相同的數(shù)據(jù)有相同的表示形式、存儲格式以及相關(guān)的操作
          ●程序中使用的所有數(shù)據(jù)都必定屬于某一種數(shù)據(jù)類型

          1.1.2數(shù)據(jù)類型的本質(zhì)

          ●數(shù)據(jù)類型可理解為創(chuàng)建變量的模具:是固定內(nèi)存大小的別名。
          ●數(shù)據(jù)類型的作用:編譯器預(yù)算對象(變量)分配的內(nèi)存空間大小。
          ●注意:數(shù)據(jù)類型只是模具,編譯器并沒有分酤空間,只有根據(jù)類型(模具)
          創(chuàng)建變量(實物),編譯器才會分配空間。

          1.2變量的本質(zhì)分析

          1.2.1變量的概念

          概念:既能讀又能寫的內(nèi)存對象,稱為變量;若一旦初始化后不能修改的對象則稱為常量。
          變量定義形式:類型標(biāo)識符,標(biāo)識符,…,標(biāo)識符;

          1.2.2變量的本質(zhì)

          1、程序通過變量來申請和命名內(nèi)存空間int a = 0。
          2、通過變量名訪問內(nèi)存空間。

          1.3程序的內(nèi)存四區(qū)模型

          流程說明
          1、操作系統(tǒng)把物理硬盤代碼load到內(nèi)存
          2、操作系統(tǒng)把c代碼分成四個區(qū)
          棧區(qū)( stack):由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等
          堆區(qū)(heap):一般由程序員分配釋放(動態(tài)內(nèi)存申請與釋放),若程序員不釋放程序結(jié)束時可能由操作系統(tǒng)回收
          全局區(qū)(靜態(tài)區(qū))( statIc):全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,該區(qū)域在程序結(jié)束后由操作系統(tǒng)釋放
          常量區(qū):字符串常量和其他常量的存儲位置,程序結(jié)束后由操作系統(tǒng)釋放。
          程序代碼區(qū):存放函數(shù)體的二進制代碼。
          3、操作系統(tǒng)找到main函數(shù)入口執(zhí)行

          1.4函數(shù)調(diào)用模型



          1.5函數(shù)調(diào)用變量傳遞分析

          (1)


          (2)


          (3)


          (4)


          (5)


          1.5棧的生長方向和內(nèi)存存放方向


          相關(guān)代碼:
          02_數(shù)據(jù)類型本質(zhì).c
          #define _CRT_SECURE_NO_WARNINGS
          #include
          #include
          #include
          #include


          int main()
          {
          int a;//告訴編譯器,分配4個字節(jié)
          int b[10];//告訴編譯器,分配4*10個字節(jié)

          /*
          類型本質(zhì):固定內(nèi)存塊大小別名
          可以通過sizeof()測試
          */

          printf("sizeof(a)=%d,sizeof(b)=%d\n", sizeof(a), sizeof(b));

          //打印地址
          //數(shù)組名稱,數(shù)組首元素地址,數(shù)組首地址
          printf("b:%d,&b:%d\n",b,&b);//地址相同

          //b,&b數(shù)組類型不同
          //b,數(shù)組首地址元素 一個元素4字節(jié),+1 地址+4
          //&b,整個數(shù)組首地址 一個數(shù)組4*10=40字節(jié), +1 地址+40
          printf("b+1:%d,&b+1:%d\n", b + 1, &b + 1);//不同


          //指針類型長度,32位機器32位系統(tǒng)下長度是 4字節(jié)
          // 64 64 8
          char********* p = NULL;
          int* q = NULL;
          printf("%d,%d\n", sizeof(p), sizeof(q));//4 , 4
          return 0;
          }
          03_給類型起別名.c
          #define _CRT_SECURE_NO_WARNINGS
          #include
          #include
          #include
          #include


          typedef unsigned int u32;

          //typedef 和結(jié)構(gòu)體結(jié)合使用
          struct Mystruct
          {

          int a;
          int b;
          };
          typedef struct Mystruct2
          {

          int a;
          int b;
          }TMP;

          /*
          void 無類型
          1.函數(shù)參數(shù)為空,定義函數(shù)時用void修飾 int fun(void)
          2.函數(shù)沒有返回值:使用void void fun (void)
          3.不能定義void類型的普通變量:void a;//err 無法確定是什么類型
          4.可以定義 void* 變量 void* p;//ok 32位系統(tǒng)下永遠(yuǎn)是4字節(jié)
          5.數(shù)據(jù)類型本質(zhì):固定內(nèi)存塊大小別名
          6.void *p萬能指針,函數(shù)返回值,函數(shù)參數(shù)

          */


          int main()
          {
          u32 t;//unsigned int

          //定義結(jié)構(gòu)體變量,一定要加上struct 關(guān)鍵字
          struct Mystruct m1;
          //Mystruct m2;//err

          TMP m3;//typedef配合結(jié)構(gòu)體使用
          struct Mystruct2 m4;

          printf("\n");
          return 0;
          }

          04_變量的賦值.c

          #define _CRT_SECURE_NO_WARNINGS
          #include
          #include
          #include
          #include



          int main()
          {
          //變量本質(zhì):一段連續(xù)內(nèi)存空間別名
          //變量相當(dāng)于門牌號,內(nèi)存相當(dāng)于房間
          int a;
          int* p;

          //直接賦值
          a = 10;

          printf("a=%d\n", a);

          //間接賦值
          printf("&a:%d\n", &a);
          p = &a;
          printf("p=%d\n", p);
          *p = 22;
          printf("*p=%d,a=%d\n", *p, a);

          return 0;
          }

          05_全局區(qū)分析.c

          #define _CRT_SECURE_NO_WARNINGS
          #include
          #include
          #include
          #include



          int main()
          {
          //變量本質(zhì):一段連續(xù)內(nèi)存空間別名
          //變量相當(dāng)于門牌號,內(nèi)存相當(dāng)于房間
          int a;
          int* p;

          //直接賦值
          a = 10;

          printf("a=%d\n", a);

          //間接賦值
          printf("&a:%d\n", &a);
          p = &a;
          printf("p=%d\n", p);
          *p = 22;
          printf("*p=%d,a=%d\n", *p, a);

          return 0;
          }

          06_堆棧區(qū)分析.c

          #define _CRT_SECURE_NO_WARNINGS
          #include
          #include
          #include
          #include


          char* get_str()
          {
          char str[] = "abcdef";//內(nèi)容分配在棧區(qū),函數(shù)運行完畢后內(nèi)存釋放
          printf("%s\n", str);

          return str;
          }

          char* get_str2()
          {
          char* temp = (char*)malloc(100);
          if (temp == NULL)
          {
          return NULL;
          }

          strcpy(temp, "abcdefg");
          return temp;
          }


          int main()
          {
          char buf[128] = { 0 };

          //strcpy(buf,get_str());
          //printf("buf = %s\n", buf);//亂碼,不確定內(nèi)容

          char* p = NULL;
          p = get_str2();
          if (p != NULL)
          {
          printf("p=%s\n", p);
          free(p);
          p = NULL;
          }
          return 0;
          }

          07_靜態(tài)局部變量.c

          #define _CRT_SECURE_NO_WARNINGS
          #include
          #include
          #include
          #include

          int* getA()
          {
          static int a = 10;//在靜態(tài)區(qū),靜態(tài)區(qū)在全局區(qū)

          return &a;
          }

          int main()
          {
          int* p = getA();
          *p = 5;
          printf("%d\n",);

          return 0;
          }

          08_棧的生長方向.c

          #define _CRT_SECURE_NO_WARNINGS
          #include
          #include
          #include
          #include

          int* getA()
          {
          static int a = 10;//在靜態(tài)區(qū),靜態(tài)區(qū)在全局區(qū)

          return &a;
          }

          int main()
          {
          int* p = getA();
          *p = 5;
          printf("%d\n",);

          return 0;
          }


          版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無法確認(rèn),我們都會標(biāo)明作者及出處,如有侵權(quán)煩請告知,我們會立即刪除并表示歉意。謝謝!


          瀏覽 56
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美黑人一级A片免费看 | 激情乱伦大杂烩 | 亚洲国内精品 | 青娱乐三级视频 | 97办公室三级电影中文字幕 |