<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語(yǔ)言基礎(chǔ)之動(dòng)態(tài)內(nèi)存操作匯總

          共 4212字,需瀏覽 9分鐘

           ·

          2024-04-18 22:45


                    

          來(lái)源:機(jī)器之心

          1、堆區(qū)空間申請(qǐng)

          #include <stdlib.h>  //頭文件
          void *malloc(size_t size);//函數(shù)
          size表示申請(qǐng)的空間字節(jié)數(shù)
          函數(shù)的返回值:
          成功:返回值空間起始地址
          失敗:NULL

          特點(diǎn):

          分配指定大小的內(nèi)存空間;

          分配的內(nèi)存空間是連續(xù)的;

          需要手動(dòng)釋放內(nèi)存;

          malloc和free是配對(duì)使用的;

          malloc和free不會(huì)自動(dòng)初始化內(nèi)存內(nèi)容

          注意:

          malloc函數(shù)返回的指針類型為void*,這意味著它是一個(gè)通用指針類型。在使用malloc函數(shù)返回的指針時(shí),需要將其強(qiáng)制轉(zhuǎn)換為所需的指針類型。

          示例1:為字符串申請(qǐng)空間

          #include <stdio.h>
          #include <stdlib.h>
          int main(int argc, char const *argv[])
          {
          //空間申請(qǐng)
          char *str = "asdasd";
          char *pb = NULL;
          pb = (char *)malloc(sizeof(str));
          if(pb == NULL)
          {
          return;
          }
          pb = str;
          printf("*pb = %s\n",pb);
          //釋放空間
          free(pb);
          return 0;
          }

          示例2:為數(shù)值申請(qǐng)空間

          #include <stdio.h>
          #include <stdlib.h>
          int main(int argc, char const *argv[])
          {
          //空間申請(qǐng)
          int *pb = NULL;
          pb = (int *)malloc(sizeof(int));
          if(pb == NULL)
          {
          return;
          }
          *pb = 10;
          printf("*pb = %d\n",*pb);
          //釋放空間
          free(pb);
          return 0;
          }

          2、堆區(qū)空間釋放

          #include <stdlib.h>
          void free(void *ptr);
          ptr需要釋放的堆區(qū)空間的起始地址

          3、memset函數(shù)

          #include <string.h>  //頭文件
          void *memset(void *s, int c, size_t n);//函數(shù)
          s 就是空間的起始地址
          c 空間中每個(gè)字節(jié) 填充的值,通常為0
          n 就是空間的字節(jié)寬度

          memset函數(shù)會(huì)將內(nèi)存區(qū)域s中的前n個(gè)字節(jié)設(shè)置為字符值c。這個(gè)函數(shù)通常用于初始化內(nèi)存區(qū)域或清空內(nèi)存區(qū)域。

          案例1:

          #include <stdio.h>
          #include <string.h>
          int main(int argc, char const *argv[])
          {
          char str[10];
          memset(str, 'A', 5); // 將str的前5個(gè)字節(jié)設(shè)置為'A'
          printf("%s\n", str); // 輸出"AAAAA"
          return 0;
          }

          案例2:

          #include <stdio.h>
          #include <string.h>
          int main(int argc, char const *argv[])
          {
          int *pb = NULL;
          pb = (int *)malloc(sizeof(int));
          if(pb == NULL)
          {
          return;
          }
          memset(pb,0,n*sizeof(int)); //將堆區(qū)空間清0
          *pb = 10;
          printf("*pb = %d\n",*pb);
          //釋放空間
          free(pb);
          return 0;
          }

          4、calloc函數(shù)

          #include <stdlib.h>
          void *calloc(size_t nmemb, size_t size);
          nmemb:內(nèi)存的塊數(shù)
          size:每一塊的字節(jié)數(shù)
          返回值:成功為堆區(qū)空間起始地址 失敗為NULL
          calloc會(huì)對(duì)申請(qǐng)的空間 自動(dòng)清0

          示例:

          #include <stdio.h>
          #include <stdlib.h>
          void Input(int *p, int n)
          {
          int i = 0;
          for (i = 0; i < n; i++)
          {
          scanf("%d", p + i);
          }
          }
          void Output(int *p, int n)
          {
          int i = 0;
          for (i = 0; i < n; i++)
          {
          printf("%d ", p[i]);
          }
          printf("\n");
          }
          int main(int argc, char const *argv[])
          {
          int n = 0;
          printf("請(qǐng)輸入int元素的個(gè)數(shù):");
          scanf("%d", &n);

          //根據(jù)元素個(gè)數(shù) 申請(qǐng)空間
          int *p = NULL;
          p = (int *)calloc(n, sizeof(int));
          if (p == NULL)
          {
          return;
          }
          //鍵盤獲取輸入
          Input(p,n);
          //遍歷
          Output(p,n);
          //釋放空間
          free(p);
          return 0;
          }

          5、realloc函數(shù)(追加空間)

          #include <stdlib.h>
          void *realloc(void *ptr, size_t size);
          ptr:指向要重新分配的內(nèi)存區(qū)域的指針。
          newSize:新的內(nèi)存區(qū)域大?。ㄒ宰止?jié)為單位)。
          如果成功,它會(huì)返回一個(gè)指向新的內(nèi)存區(qū)域的指針。如果失敗,它會(huì)返回NULL。

          示例:

          #include <stdio.h>  
          #include <stdlib.h>

          int main() {
          int *arr = (int *)malloc(5 * sizeof(int)); // 分配5個(gè)整數(shù)的內(nèi)存空間
          if (arr == NULL) {
          printf("Memory allocation failed.\n");
          return 1;
          }

          // 使用realloc重新分配內(nèi)存空間,將大小改為10個(gè)整數(shù)
          arr = (int *)realloc(arr, 10 * sizeof(int));
          if (arr == NULL) {
          printf("Memory reallocation failed.\n");
          return 1;
          }

          // 在新分配的內(nèi)存空間中存儲(chǔ)一些值
          for (int i = 0; i < 10; i++) {
          arr[i] = i;
          }

          // 輸出數(shù)組中的值
          for (int i = 0; i < 10; i++) {
          printf("%d ", arr[i]);
          }
          printf("\n");

          free(arr); // 釋放動(dòng)態(tài)分配的內(nèi)存空間
          return 0;
          }

          6、內(nèi)存的泄露


          程序無(wú)法正確釋放不再使用的內(nèi)存時(shí)。內(nèi)存泄漏會(huì)導(dǎo)致程序消耗越來(lái)越多的內(nèi)存,直到耗盡所有可用內(nèi)存,導(dǎo)致程序崩潰或運(yùn)行緩慢。

          內(nèi)存泄漏通常發(fā)生在以下情況:

          動(dòng)態(tài)分配的內(nèi)存未釋放;

          局部變量未釋放;

          結(jié)構(gòu)體或數(shù)組未釋放;

          為了檢測(cè)和避免內(nèi)存泄漏,可以使用一些工具和技術(shù),例如:

          使用靜態(tài)代碼分析工具:這些工具可以檢查代碼中的潛在錯(cuò)誤,包括內(nèi)存泄漏。

          使用動(dòng)態(tài)分析工具:這些工具可以在程序運(yùn)行時(shí)檢測(cè)內(nèi)存泄漏。例如,Valgrind是一種流行的動(dòng)態(tài)分析工具,可以檢測(cè)C語(yǔ)言程序中的內(nèi)存泄漏。

          編寫代碼時(shí)注意內(nèi)存管理:在編寫代碼時(shí),應(yīng)該注意何時(shí)分配和釋放內(nèi)存。確保在使用完動(dòng)態(tài)分配的內(nèi)存后及時(shí)釋放它們,并避免使用指向局部變量的指針。

          使用智能指針:智能指針是一種自動(dòng)管理內(nèi)存的機(jī)制,可以在適當(dāng)?shù)臅r(shí)候自動(dòng)釋放內(nèi)存,從而避免內(nèi)存泄漏。在C++中,可以使用智能指針來(lái)管理動(dòng)態(tài)分配的內(nèi)存。

          7、總結(jié)

          空間的申請(qǐng)

          malloc(size_t size);//空間申請(qǐng)
          calloc(size_t nmemb, size_t size);//空間塊申請(qǐng)

          空間的使用

          memset(void *s, int c, size_t n);//空間初始化
          calloc(size_t nmemb, size_t size);//空間追加

          空間的釋放

          free(void *ptr);//空間釋放


          春招已經(jīng)開始啦,大家如果不做好充足準(zhǔn)備的話,春招很難找到好工作。


          送大家一份就業(yè)大禮包,大家可以突擊一下春招,找個(gè)好工作!


          瀏覽 23
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  久久另类TS人妖一区二区 | 成人网站视频大香蕉 | 在一起做爱视频 | 精品熟人一区二区三区四区 | 在线免费观看黄片小视 |