中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

濰坊網(wǎng)站建設(shè)哪家好外貿(mào)平臺(tái)排名

濰坊網(wǎng)站建設(shè)哪家好,外貿(mào)平臺(tái)排名,就業(yè)合同模板,哪有做網(wǎng)站 的目錄 1 C 程序內(nèi)存區(qū)域劃分 1.1 代碼區(qū) (Code Section) 1.2 全局/靜態(tài)區(qū) (Global/Static Section) 1.3 棧區(qū) (Stack Section) 1.4 堆區(qū) (Heap Section) 1.5 動(dòng)態(tài)內(nèi)存分配 2 void 指針(無類型指針) 2.1 void 指針介紹 2.2 void 指針的作用 2.3 …

目錄

1?C 程序內(nèi)存區(qū)域劃分

1.1 代碼區(qū) (Code Section)

1.2 全局/靜態(tài)區(qū) (Global/Static Section)

1.3 棧區(qū) (Stack Section)

1.4?堆區(qū) (Heap Section)

1.5 動(dòng)態(tài)內(nèi)存分配

2 void 指針(無類型指針)

2.1 void 指針介紹

2.2 void 指針的作用

2.3 void 指針的特點(diǎn)

2.4?void 指針類型轉(zhuǎn)換注意事項(xiàng)

2.4.1 其他類型指針賦給 void 指針

2.4.2 void 指針賦給其他類型指針

3?malloc() 函數(shù)

3.1?函數(shù)原型

3.2 使用步驟

3.3?動(dòng)態(tài)分配整型數(shù)據(jù)的空間

3.4?動(dòng)態(tài)分配數(shù)組空間

4 calloc() 函數(shù)

4.1 函數(shù)原型

4.2 使用步驟

4.3 案例演示

5?realloc() 與 _msize 函數(shù)

5.1 函數(shù)原型

5.2 使用步驟

5.3 案例演示

6 內(nèi)存泄漏與 free() 函數(shù)

6.1?內(nèi)存泄漏

6.2?free() 函數(shù)

6.2.1 函數(shù)原型

6.2.2 使用步驟

6.2.3 注意事項(xiàng)

6.2.4 案例演示

7?內(nèi)存分配的基本原則

7.1 避免分配大量的小內(nèi)存塊

7.2 僅在需要時(shí)分配內(nèi)存

7.3 總是確保釋放已分配的內(nèi)存

8 綜合案例


1?C 程序內(nèi)存區(qū)域劃分

????????在 C 語言中,內(nèi)存可以分為幾個(gè)不同的區(qū)域,每個(gè)區(qū)域都有其特定的作用。

1.1 代碼區(qū) (Code Section)

????????也稱為文本區(qū),是只讀的用于存放程序的機(jī)器指令。

????????這個(gè)區(qū)域的內(nèi)容是在程序編譯時(shí)確定的,并且在程序運(yùn)行期間不會(huì)改變。

1.2 全局/靜態(tài)區(qū) (Global/Static Section)

????????這個(gè)區(qū)域用于存儲(chǔ)全局變量和靜態(tài)變量。

????????全局變量是在所有函數(shù)外部定義的變量,它們?cè)谡麄€(gè)程序的生命周期內(nèi)都存在。

????????靜態(tài)變量可以在全局或局部范圍內(nèi)定義,但無論在哪里定義,它們都會(huì)在這個(gè)區(qū)域分配空間,并且在整個(gè)程序執(zhí)行過程中保持存在。

????????初始化的全局變量和靜態(tài)變量會(huì)被分配到已初始化的數(shù)據(jù)段(如 .data 段),而未初始化的全局變量和靜態(tài)變量則會(huì)被分配到未初始化的數(shù)據(jù)段(如 .bss 段)。

1.3 棧區(qū) (Stack Section)

????????棧區(qū)用于存儲(chǔ)函數(shù)的局部變量和函數(shù)調(diào)用信息(如返回地址)。

????????當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),一個(gè)新的棧幀(stack frame)會(huì)被創(chuàng)建并壓入棧頂,其中包含了該函數(shù)所有局部變量。

????????函數(shù)執(zhí)行完畢后,這個(gè)棧幀會(huì)被彈出棧,釋放了該函數(shù)使用的內(nèi)存。

????????棧區(qū)的操作是自動(dòng)化的,由編譯器管理,不需要程序員手動(dòng)干預(yù)。

1.4?堆區(qū) (Heap Section)

????????堆區(qū)是一個(gè)動(dòng)態(tài)分配內(nèi)存的區(qū)域,通常通過 malloc()、calloc()、realloc() 和 free() 等函數(shù)進(jìn)行管理。

????????動(dòng)態(tài)內(nèi)存分配允許程序在運(yùn)行時(shí)請(qǐng)求任意大小的內(nèi)存塊,這對(duì)于處理未知大小的數(shù)據(jù)集非常有用。

????????一旦不再需要這塊內(nèi)存,應(yīng)該調(diào)用 free() 函數(shù)釋放它,以避免內(nèi)存泄漏。

1.5 動(dòng)態(tài)內(nèi)存分配

????????動(dòng)態(tài)內(nèi)存分配是指在程序運(yùn)行時(shí)根據(jù)需要從堆區(qū)請(qǐng)求內(nèi)存的行為

????????由于動(dòng)態(tài)分配的內(nèi)存沒有與任何變量名關(guān)聯(lián),因此必須使用指針來訪問這些內(nèi)存。

????????使用動(dòng)態(tài)內(nèi)存分配時(shí),程序員需要負(fù)責(zé)確保正確地分配和釋放內(nèi)存,以防止內(nèi)存泄漏或其他錯(cuò)誤。


2 void 指針(無類型指針)

2.1 void 指針介紹

????????在 C 語言中,void 指針是一種特殊的指針類型,它可以指向任何類型的數(shù)據(jù)。C99 標(biāo)準(zhǔn)允許定義一個(gè)類型為 void 的指針變量,這種指針在編譯時(shí)沒有具體的類型信息,因此可以靈活地用于各種場(chǎng)景。

2.2 void 指針的作用

????????靈活性:指針變量必須有類型,以便編譯器知道如何解釋內(nèi)存塊中的二進(jìn)制數(shù)據(jù)。然而,在某些情況下,當(dāng)向系統(tǒng)請(qǐng)求內(nèi)存時(shí),可能還不確定會(huì)有什么類型的數(shù)據(jù)寫入內(nèi)存。此時(shí),可先使用void指針獲取內(nèi)存塊(僅含地址信息,無類型信息),待后續(xù)使用時(shí)再明確數(shù)據(jù)類型。

????????通用性:void 指針在函數(shù)參數(shù)傳遞和通用數(shù)據(jù)處理中非常有用,尤其是在實(shí)現(xiàn)泛型編程時(shí),可以避免重復(fù)編寫針對(duì)不同數(shù)據(jù)類型的代碼。

2.3 void 指針的特點(diǎn)

????????類型轉(zhuǎn)換:void 指針與其他所有類型的指針之間可以互相轉(zhuǎn)換。任一類型的指針都可以轉(zhuǎn)換為 void 指針,而 void 指針也可以轉(zhuǎn)換為任一類型的指針。

????????解引用限制:由于 void 指針沒有具體的類型信息,因此不能直接使用 * 運(yùn)算符(解引用)來訪問它所指向的值。如果需要訪問 void 指針指向的數(shù)據(jù),必須先將其轉(zhuǎn)換為適當(dāng)?shù)念愋椭羔?/span>。

#include <stdio.h>int main()
{int num = 42;double pi = 3.14159;// 將 int 指針隱式轉(zhuǎn)換為 void 指針void *viPtr = &num;// 將 double 指針隱式轉(zhuǎn)換為 void 指針void *vdPtr = &pi;// 將 void 指針轉(zhuǎn)換為 int 指針并解引用// int *intPtr = viPtr;        // 隱式類型轉(zhuǎn)換int *intPtr = (int *)viPtr;      // 顯示類型轉(zhuǎn)換printf("整數(shù)值:%d\n", *intPtr); // 42// 將 void 指針轉(zhuǎn)換為 double 指針并解引用// double *doublePtr = vdPtr; // 隱式類型轉(zhuǎn)換double *doublePtr = (double *)vdPtr; // 顯示類型轉(zhuǎn)換printf("浮點(diǎn)數(shù):%f\n", *doublePtr);  // 3.141590// void 指針不能直接解引用,會(huì)導(dǎo)致編譯錯(cuò)誤// 下面的代碼會(huì)報(bào)錯(cuò)// printf("%d\n", *viPtr);// printf("%f\n", *vdPtr);// 如果需要訪問 void 指針指向的數(shù)據(jù),必須先將其轉(zhuǎn)換為適當(dāng)?shù)念愋椭羔榩rintf("%d\n", *(int *)viPtr);    // 42printf("%f\n", *(double *)vdPtr); // 3.141590return 0;
}

2.4?void 指針類型轉(zhuǎn)換注意事項(xiàng)

2.4.1 其他類型指針賦給 void 指針

????????將其他類型指針賦給 void 指針時(shí),可以使用隱式轉(zhuǎn)換,因?yàn)?void 指針不包含指向的數(shù)據(jù)類型的信息,通常是安全的。

int num = 42;
double pi = 3.14159;// 將 int 指針隱式轉(zhuǎn)換為 void 指針
void *viPtr = &num;// 將 double 指針隱式轉(zhuǎn)換為 void 指針
void *vdPtr = &pi;

2.4.2 void 指針賦給其他類型指針

????????將 void 指針賦給其他類型指針時(shí),建議使用顯式類型轉(zhuǎn)換,這樣更加安全。如果使用隱式類型轉(zhuǎn)換,有些編譯器會(huì)觸發(fā)警告。

// 將 void 指針顯式轉(zhuǎn)換為 int 指針并解引用
int *intPtr = (int *)viPtr;
printf("整數(shù)值:%d\n", *intPtr);// 將 void 指針顯式轉(zhuǎn)換為 double 指針并解引用
double *doublePtr = (double *)vdPtr;
printf("浮點(diǎn)數(shù):%f\n", *doublePtr);

3?malloc() 函數(shù)

3.1?函數(shù)原型

????????malloc() 函數(shù)用于在程序運(yùn)行時(shí)動(dòng)態(tài)分配一塊連續(xù)的內(nèi)存空間。這是 C 語言中常用的動(dòng)態(tài)內(nèi)存分配函數(shù)之一,通常與 free() 函數(shù)一起使用,以確保內(nèi)存的正確管理和釋放。

#include <stdlib.h>
void *malloc(size_t size);
  • size:要分配的內(nèi)存塊的大小,以字節(jié)為單位
  • 如果內(nèi)存分配成功,返回一個(gè) void 指針,指向新分配內(nèi)存塊的起始地址。
  • 如果內(nèi)存分配失敗(例如內(nèi)存不足)返回一個(gè)空指針 NULL。

3.2 使用步驟

  • 分配內(nèi)存:調(diào)用 malloc() 函數(shù),傳入所需的內(nèi)存大小。
  • 檢查返回值:檢查返回的指針是否為 NULL,以確保內(nèi)存分配成功。
  • 使用內(nèi)存:將返回的 void 指針轉(zhuǎn)換為適當(dāng)?shù)念愋椭羔?#xff0c;并使用該指針訪問分配的內(nèi)存。
  • 釋放內(nèi)存:使用 free() 函數(shù)釋放分配的內(nèi)存,以避免內(nèi)存泄漏。

3.3?動(dòng)態(tài)分配整型數(shù)據(jù)的空間

#include <stdio.h>
#include <stdlib.h>int main()
{// 在棧區(qū)直接創(chuàng)建局部變量int num = 120;int *p = NULL;// 動(dòng)態(tài)分配整型數(shù)據(jù)的空間// malloc(sizeof(int)) 請(qǐng)求分配一個(gè) int 類型大小的內(nèi)存塊// (int *) 是顯式類型轉(zhuǎn)換,將 void 指針轉(zhuǎn)換為 int 指針// p 指向新分配內(nèi)存塊的起始地址p = (int *)malloc(sizeof(int));// 檢查內(nèi)存是否分配成功if (p == NULL){printf("內(nèi)存分配失敗\n");return 1; // 退出程序}// p = &num; 不要這樣操作,這相當(dāng)于修改了指針 p 的指向,就沒有用到上面動(dòng)態(tài)分配的空間// 使用解引用賦值并輸出*p = num;printf("p指向的地址(堆區(qū)):%p\n", (void *)p);printf("局部變量num的地址(棧區(qū)):%p\n", (void *)&num);printf("p指向的值:%d\n", *p); // 120// 釋放分配的內(nèi)存,避免內(nèi)存泄漏// free(p); // 簡(jiǎn)單處理// 推薦處理if (p != NULL){free(p);p = NULL; // 釋放后將指針設(shè)為 NULL,避免懸掛指針}return 0;
}

?????????輸出結(jié)果如下所示:

3.4?動(dòng)態(tài)分配數(shù)組空間

????????在 C 語言中,malloc() 函數(shù)不僅可用于分配單個(gè)變量的內(nèi)存,還可以用于動(dòng)態(tài)分配數(shù)組的內(nèi)存。以下是一個(gè)示例,展示了如何使用 malloc() 函數(shù)動(dòng)態(tài)分配整型數(shù)組的內(nèi)存,并對(duì)其進(jìn)行操作。

#include <stdio.h>
#include <stdlib.h>int main()
{int *p = NULL; // 定義整型指針int n = 5;     // 定義數(shù)組長度// int array[n];  錯(cuò)誤,表達(dá)式必須含有常量值// 動(dòng)態(tài)分配內(nèi)存,將地址賦給指針 p// malloc(n * sizeof(int)) 請(qǐng)求分配一個(gè)大小為 n * sizeof(int) 的內(nèi)存塊,即 n 個(gè) int 類型的內(nèi)存// (int *) 是顯式類型轉(zhuǎn)換,將 void 指針轉(zhuǎn)換為 int 指針// p 指向新分配內(nèi)存塊的起始地址p = (int *)malloc(n * sizeof(int));// 判斷是否分配成功if (p == NULL){printf("內(nèi)存分配失敗\n");return 1; // 退出程序}// 給數(shù)組元素賦值for (int i = 0; i < n; i++){p[i] = i * 10;}// 輸出數(shù)組的元素for (int i = 0; i < n; i++){printf("p[%d] = %d\n", i, p[i]);}// 釋放分配的內(nèi)存,避免內(nèi)存泄漏// free(p); // 簡(jiǎn)單處理// 推薦處理if (p != NULL){free(p);p = NULL; // 釋放后將指針設(shè)為 NULL,避免懸掛指針}return 0;
}

????????輸出結(jié)果如下所示:


4 calloc() 函數(shù)

4.1 函數(shù)原型

????????calloc() 函數(shù)用于在程序運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,并將分配的內(nèi)存初始化為零。這是 C 語言中常用的動(dòng)態(tài)內(nèi)存分配函數(shù)之一,通常與 free() 函數(shù)一起使用,以確保內(nèi)存的正確管理和釋放。

#include <stdlib.h>
void *calloc(size_t numElements, size_t sizeOfElement);
  • numElements要分配的元素的數(shù)量。
  • sizeOfElement每個(gè)元素的大小(以字節(jié)為單位)。
  • 如果內(nèi)存分配成功,返回一個(gè) void 指針,指向新分配內(nèi)存塊的起始地址。
  • 如果內(nèi)存分配失敗(例如內(nèi)存不足),返回一個(gè)空指針 NULL。

4.2 使用步驟

  • 分配內(nèi)存:調(diào)用 calloc() 函數(shù),傳入所需的元素?cái)?shù)量和每個(gè)元素的大小。
  • 檢查返回值:檢查返回的指針是否為 NULL,以確保內(nèi)存分配成功。
  • 使用內(nèi)存:將返回的 void 指針轉(zhuǎn)換為適當(dāng)?shù)念愋椭羔?#xff0c;并使用該指針訪問分配的內(nèi)存。
  • 釋放內(nèi)存:使用 free() 函數(shù)釋放分配的內(nèi)存,以避免內(nèi)存泄漏。

4.3 案例演示

????????以下是一個(gè)示例代碼,展示了如何使用 calloc() 函數(shù)動(dòng)態(tài)分配整型數(shù)組的內(nèi)存,并將其初始化為零:

#include <stdio.h>
#include <stdlib.h>int main()
{int *p = NULL; // 定義整型指針int n = 5;     // 定義數(shù)組長度// 動(dòng)態(tài)分配內(nèi)存并初始化為零,將地址賦給指針 p// calloc(n, sizeof(int)) 請(qǐng)求分配一個(gè)大小為 n * sizeof(int) 的內(nèi)存塊,并將每個(gè)字節(jié)初始化為零// (int *) 是顯式類型轉(zhuǎn)換,將 void 指針轉(zhuǎn)換為 int 指針p = (int *)calloc(n, sizeof(int));// 判斷是否分配成功if (p == NULL){printf("內(nèi)存分配失敗\n");return 1; // 退出程序}// 輸出數(shù)組的元素的值for (int i = 0; i < n; i++){printf("p[%d] = %d\n", i, p[i]); // 全是 0}// 給數(shù)組元素賦值for (int i = 0; i < n; i++){p[i] = i * 10;}// 輸出數(shù)組的元素for (int i = 0; i < n; i++){printf("p[%d] = %d\n", i, p[i]); // 0 10 20 30 40}// 釋放分配的內(nèi)存,避免內(nèi)存泄漏// free(p); // 簡(jiǎn)單處理// 推薦處理if (p != NULL){free(p);p = NULL; // 釋放后將指針設(shè)為 NULL,避免懸掛指針}return 0;
}

????????輸出結(jié)果如下所示:


5?realloc() 與 _msize 函數(shù)

5.1 函數(shù)原型

????????realloc() 函數(shù)用于重新分配 malloc() 或 calloc() 函數(shù)所獲得的內(nèi)存塊的大小。這在需要?jiǎng)討B(tài)調(diào)整內(nèi)存大小時(shí)非常有用。

#include <stdlib.h>
void *realloc(void *ptr, size_t size);
  • ptr要重新分配的內(nèi)存塊的指針
  • size新的內(nèi)存塊的大小(以字節(jié)為單位)。
  • 返回一個(gè)指向重新分配內(nèi)存塊的指針。如果內(nèi)存重新分配成功,返回的指針可能與原始指針相同,也可能不同。
  • 如果內(nèi)存分配失敗,返回一個(gè)空指針 NULL。
  • 如果在原內(nèi)存塊上進(jìn)行縮減,通常返回的地址與原來的地址相同。

5.2 使用步驟

  • 分配內(nèi)存:使用 malloc() 或 calloc() 函數(shù)分配初始內(nèi)存。
  • 重新分配內(nèi)存:調(diào)用 realloc() 函數(shù),傳入當(dāng)前指針和新的內(nèi)存大小。
  • 檢查返回值:檢查返回的指針是否為 NULL,以確保內(nèi)存重新分配成功。
  • 使用新的內(nèi)存:使用返回的新指針訪問重新分配的內(nèi)存。
  • 釋放內(nèi)存:使用 free() 函數(shù)釋放分配的內(nèi)存,以避免內(nèi)存泄漏。

5.3 案例演示

????????以下是一個(gè)示例代碼,展示了如何使用 realloc() 函數(shù)動(dòng)態(tài)調(diào)整內(nèi)存大小,并使用 _msize() 函數(shù)獲取指定內(nèi)存塊的大小:

????????_msize() 函數(shù)用于獲取指定內(nèi)存塊的大小,但請(qǐng)注意,這個(gè)函數(shù)不是標(biāo)準(zhǔn) C 庫的一部分,而是特定于某些平臺(tái)(如 Windows)。在其他平臺(tái)上,可能需要使用其他方法來獲取內(nèi)存塊的大小。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>int main()
{// 聲明指針int *p = NULL;// 分配內(nèi)存// 使用 malloc() 函數(shù)分配初始內(nèi)存,大小為 100 * sizeof(int)p = (int *)malloc(sizeof(int) * 100);if (p == NULL){printf("初始內(nèi)存分配失敗\n");return 1;}// 使用 _msize() 函數(shù)獲取分配的內(nèi)存大小,并輸出指針地址和內(nèi)存大小printf("p=%p, size:%zu 字節(jié)\n", p, _msize(p)); // 400// 調(diào)整內(nèi)存大小p = (int *)realloc(p, sizeof(int) * 2000);if (p == NULL){printf("內(nèi)存重新分配失敗\n");return 1;}// 使用 _msize() 函數(shù)獲取分配的內(nèi)存大小,并輸出指針地址和內(nèi)存大小printf("p=%p, size:%zu 字節(jié)\n", p, _msize(p)); // 8000// 再次調(diào)整內(nèi)存大小// 如果在原內(nèi)存塊上進(jìn)行縮減,通常返回的地址與原來的地址相同p = (int *)realloc(p, sizeof(int) * 200);if (p == NULL){printf("內(nèi)存重新分配失敗\n");return 1;}// 使用 _msize() 函數(shù)獲取分配的內(nèi)存大小,并輸出指針地址和內(nèi)存大小printf("p=%p, size:%zu 字節(jié)\n", p, _msize(p)); // 800// 釋放分配的內(nèi)存,避免內(nèi)存泄漏// free(p); // 簡(jiǎn)單處理// 推薦處理if (p != NULL){free(p);p = NULL; // 釋放后將指針設(shè)為 NULL,避免懸掛指針}return 0;
}

????????輸出結(jié)果如下所示:


6 內(nèi)存泄漏與 free() 函數(shù)

6.1?內(nèi)存泄漏

????????內(nèi)存泄漏是指在程序運(yùn)行過程中,動(dòng)態(tài)分配的內(nèi)存空間沒有被正確釋放,導(dǎo)致系統(tǒng)中的可用內(nèi)存逐漸減少,直到耗盡系統(tǒng)可用的內(nèi)存資源。內(nèi)存泄漏不僅會(huì)影響程序的性能,還可能導(dǎo)致程序崩潰或系統(tǒng)不穩(wěn)定。

6.2?free() 函數(shù)

6.2.1 函數(shù)原型

????????free() 函數(shù)用于釋放動(dòng)態(tài)分配的內(nèi)存,以便將內(nèi)存返回給操作系統(tǒng),防止內(nèi)存泄漏。

void free(void *ptr);
  • ptr指向要釋放的內(nèi)存塊的指針。ptr 必須是通過 malloc()、calloc() 或 realloc() 動(dòng)態(tài)分配的內(nèi)存塊地址。
  • free() 函數(shù)沒有返回值。

6.2.2 使用步驟

  • 分配內(nèi)存:使用 malloc()、calloc() 或 realloc() 函數(shù)動(dòng)態(tài)分配內(nèi)存。
  • 使用內(nèi)存:在程序中使用分配的內(nèi)存。
  • 釋放內(nèi)存:使用 free() 函數(shù)釋放分配的內(nèi)存,確保內(nèi)存返回給操作系統(tǒng)。

6.2.3 注意事項(xiàng)

1. 避免雙重釋放:

????????釋放的內(nèi)存塊一旦被 free() 釋放,就不應(yīng)該再次操作已經(jīng)釋放的地址,也不應(yīng)該再次使用 free() 對(duì)該地址釋放第二次。這會(huì)導(dǎo)致未定義行為,可能會(huì)導(dǎo)致程序崩潰。

int *p = (int *)malloc(sizeof(int));
free(p);  // 第一次釋放
free(p);  // 錯(cuò)誤:第二次釋放

2. 避免內(nèi)存泄漏:

????????如果忘記調(diào)用 free() 函數(shù),會(huì)導(dǎo)致無法訪問未回收的內(nèi)存塊,構(gòu)成內(nèi)存泄漏。

int *p = (int *)malloc(sizeof(int));
// 忘記釋放內(nèi)存
// free(p);  // 應(yīng)該在這里釋放內(nèi)存

3. 檢查指針是否為 NULL:

????????在釋放內(nèi)存之前,最好檢查指針是否為 NULL。釋放 NULL 指針是安全的,不會(huì)導(dǎo)致錯(cuò)誤,但這是一個(gè)良好的編程習(xí)慣。

????????釋放內(nèi)存后,最好將指針設(shè)為 NULL,以避免懸掛指針(即指向已釋放內(nèi)存的指針)。

int *p = (int *)malloc(sizeof(int));
if (p != NULL) {free(p);p = NULL;  // 釋放后將指針設(shè)為 NULL,避免懸掛指針
}

6.2.4 案例演示

????????以下是一個(gè)示例代碼,展示了如何正確使用 malloc() 和 free() 函數(shù),避免內(nèi)存泄漏和雙重釋放:

#include <stdio.h>
#include <stdlib.h>int main() {int *p = NULL;  // 定義整型指針// 動(dòng)態(tài)分配內(nèi)存p = (int *)malloc(sizeof(int));if (p == NULL) {printf("內(nèi)存分配失敗\n");return 1;}// 使用分配的內(nèi)存*p = 120;printf("p指向的地址:%p\n", (void *)p);printf("p指向的值:%d\n", *p);// 釋放分配的內(nèi)存if (p != NULL) {free(p);p = NULL;  // 釋放后將指針設(shè)為 NULL}return 0;
}

7?內(nèi)存分配的基本原則

????????在 C 語言中,動(dòng)態(tài)內(nèi)存分配是一項(xiàng)重要的任務(wù),合理的內(nèi)存管理可以提高程序的性能和穩(wěn)定性。以下是一些內(nèi)存分配的基本原則:

7.1 避免分配大量的小內(nèi)存塊

????????原因:分配堆上的內(nèi)存有一些系統(tǒng)開銷,包括分配和釋放內(nèi)存時(shí)的管理開銷。分配許多小的內(nèi)存塊會(huì)增加這些開銷,從而影響程序的性能。

????????建議盡量合并多個(gè)小內(nèi)存塊的分配,使用較大的內(nèi)存塊來減少系統(tǒng)開銷。例如,可以預(yù)先分配一個(gè)較大的緩沖區(qū),然后在需要時(shí)從中劃分出所需的小內(nèi)存塊。

7.2 僅在需要時(shí)分配內(nèi)存

????????原因:動(dòng)態(tài)分配的內(nèi)存會(huì)占用系統(tǒng)的資源,如果分配了不必要的內(nèi)存,不僅浪費(fèi)資源,還可能導(dǎo)致內(nèi)存泄漏

????????建議在實(shí)際需要使用內(nèi)存時(shí)再進(jìn)行分配,并且在使用完內(nèi)存后及時(shí)釋放。避免過早分配內(nèi)存或分配過多的內(nèi)存。

7.3 總是確保釋放已分配的內(nèi)存

????????原因未釋放的內(nèi)存會(huì)導(dǎo)致內(nèi)存泄漏,隨著時(shí)間的推移,內(nèi)存泄漏會(huì)逐漸消耗系統(tǒng)資源,最終可能導(dǎo)致程序崩潰或系統(tǒng)不穩(wěn)定。

????????建議在編寫分配內(nèi)存的代碼時(shí),就要確定好在代碼的什么地方釋放內(nèi)存。使用 free() 函數(shù)釋放不再需要的內(nèi)存,并確保不會(huì)對(duì)同一個(gè)內(nèi)存塊多次釋放。

#include <stdio.h>
#include <stdlib.h>// 分配和釋放內(nèi)存的輔助函數(shù)
void allocate_and_use_memory() {int *p = NULL;// 僅在需要時(shí)分配內(nèi)存p = (int *)malloc(sizeof(int) * 1000);if (p == NULL) {printf("內(nèi)存分配失敗\n");return;}// 使用分配的內(nèi)存for (int i = 0; i < 1000; i++) {p[i] = i * 10;}// 輸出部分元素for (int i = 0; i < 10; i++) {printf("p[%d] = %d\n", i, p[i]);}// 及時(shí)釋放內(nèi)存if (p != NULL){free(p);p = NULL; // 釋放后將指針設(shè)為 NULL,避免懸掛指針}
}int main() {// 調(diào)用內(nèi)存管理函數(shù)allocate_and_use_memory();return 0;
}

8 綜合案例

????????動(dòng)態(tài)創(chuàng)建數(shù)組,輸入 5 個(gè)學(xué)生的成績(jī),再定義一個(gè)函數(shù)檢測(cè)成績(jī)低于 60 分的,輸出不合格的成績(jī)。

#include <stdlib.h>
#include <stdio.h>// 函數(shù)原型聲明
void check(int *);int main()
{int *p = NULL;// 在堆區(qū)開辟一個(gè) 5 * 4 的空間,用于存儲(chǔ) 5 個(gè)整數(shù)p = (int *)malloc(5 * sizeof(int));// 檢查內(nèi)存是否分配成功if (p == NULL){printf("內(nèi)存分配失敗\n");return 1; // 退出程序}printf("請(qǐng)輸入5個(gè)成績(jī)(整數(shù)):");// 從用戶輸入讀取 5 個(gè)整數(shù),存儲(chǔ)到動(dòng)態(tài)分配的內(nèi)存中for (int i = 0; i < 5; i++){// scanf("%d", p + i); // 使用指針?biāo)阈g(shù),將輸入的整數(shù)存儲(chǔ)到 p[i] 中// p + i 是指針?biāo)阈g(shù),表示將指針 p 向后移動(dòng) i 個(gè)元素的位置scanf("%d", &p[i]); // 使用數(shù)組形式,將輸入的整數(shù)存儲(chǔ)到 p[i] 中// &p[i] 是取地址操作,表示 p 指向的數(shù)組中第 i 個(gè)元素的地址}// 調(diào)用 check 函數(shù),檢查不及格的成績(jī)check(p);// 釋放動(dòng)態(tài)分配的內(nèi)存,避免內(nèi)存泄漏free(p);p = NULL; // 避免懸掛指針return 0;
}// 函數(shù)定義
void check(int *p)
{printf("不及格的成績(jī)有: ");// 遍歷動(dòng)態(tài)分配的內(nèi)存中的 5 個(gè)整數(shù)for (int i = 0; i < 5; i++){// 如果成績(jī)小于 60,輸出該成績(jī)if (p[i] < 60){printf(" %d ", p[i]);}}
}

????????輸出結(jié)果如下所示:

http://www.risenshineclean.com/news/47339.html

相關(guān)文章:

  • 找人代做網(wǎng)站需要注意什么簡(jiǎn)述常用的網(wǎng)絡(luò)營銷方法
  • 如何做網(wǎng)站地圖百度官網(wǎng)首頁官網(wǎng)
  • 網(wǎng)站支付寶怎么做的營銷和銷售的區(qū)別在哪里
  • 佛山市品牌網(wǎng)站建設(shè)哪家好網(wǎng)站建設(shè)與營銷經(jīng)驗(yàn)
  • 新開傳奇網(wǎng)站3000ok推廣游戲賺錢的平臺(tái)
  • 陜西做網(wǎng)站社會(huì)化媒體營銷
  • 深圳網(wǎng)站建設(shè)sumaart精準(zhǔn)粉絲引流推廣
  • eclipse做網(wǎng)站表格百度競(jìng)價(jià)推廣教程
  • 個(gè)人頁網(wǎng)址seo研究中心教程
  • 中央廣播電視總臺(tái)2024網(wǎng)絡(luò)春晚seo網(wǎng)站優(yōu)化推廣費(fèi)用
  • flash軟件做的網(wǎng)站最后需要用dreamweaver調(diào)整廣州seo公司如何
  • 如何在網(wǎng)站上做網(wǎng)上亮照常用的seo工具的是有哪些
  • asp.net建網(wǎng)站2023年8月疫情恢復(fù)
  • 做國內(nèi)貿(mào)易的網(wǎng)站網(wǎng)站推廣技術(shù)
  • 儀器儀表網(wǎng)站制作搜索軟件使用排名
  • 關(guān)于 公司網(wǎng)站建設(shè)的通知營銷頁面
  • 網(wǎng)站SEO做點(diǎn)提升流量象客下載百度極速版免費(fèi)安裝
  • 在線制作簡(jiǎn)歷網(wǎng)站卡點(diǎn)視頻免費(fèi)制作軟件
  • 能被百度收錄的建站網(wǎng)站網(wǎng)站建設(shè)方案推廣
  • 做營銷策劃的上哪個(gè)網(wǎng)站好鄭州網(wǎng)絡(luò)推廣大包
  • 固安做網(wǎng)站的免費(fèi)發(fā)布推廣信息的平臺(tái)有哪些
  • 江門網(wǎng)站優(yōu)化公司seo優(yōu)化排名技術(shù)百度教程
  • 鶴山做網(wǎng)站公司seo推廣優(yōu)化官網(wǎng)
  • 網(wǎng)站開發(fā)員工保密協(xié)議網(wǎng)絡(luò)營銷的成功案例分析
  • 哪些公司做網(wǎng)站競(jìng)價(jià)排名的優(yōu)缺點(diǎn)
  • 做企業(yè)網(wǎng)站要用什么軟件谷歌chrome官網(wǎng)
  • 做網(wǎng)站是不是要學(xué)編程外包公司怎么賺錢
  • ofbiz做的網(wǎng)站網(wǎng)絡(luò)輿情監(jiān)控
  • 網(wǎng)站備案很麻煩嗎網(wǎng)站模板圖片
  • 有哪些做普洱茶網(wǎng)站的seo關(guān)鍵詞優(yōu)化