国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言 — 動態(tài)內(nèi)存管理(動態(tài)內(nèi)存函數(shù))

這篇具有很好參考價值的文章主要介紹了C語言 — 動態(tài)內(nèi)存管理(動態(tài)內(nèi)存函數(shù))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

本期分為三篇介紹動態(tài)內(nèi)存管理相關(guān)內(nèi)容,關(guān)注博主了解更多
博主博客鏈接:https://blog.csdn.net/m0_74014525
本期介紹動態(tài)內(nèi)存函數(shù),函數(shù)如何使用、函數(shù)格式、在使用在所需要的注意點及C/C++程序的內(nèi)存開辟區(qū)域


系列文章

第一篇:C語言 — 動態(tài)內(nèi)存管理(動態(tài)內(nèi)存函數(shù))
第二篇:C語言 — 常見的動態(tài)內(nèi)存錯誤
第三篇:C語言 — 柔性數(shù)組


一、動態(tài)內(nèi)存分配是什么

動態(tài)內(nèi)存分配是指在程序運行期間由程序自己向操作系統(tǒng)請求分配一定大小的內(nèi)存空間,以存儲程序運行時所需的數(shù)據(jù)。 由于動態(tài)分配的內(nèi)存空間在程序運行期間是可變的,所以它比靜態(tài)分配更加靈活。

動態(tài)內(nèi)存分配帶來的好處是可以根據(jù)實際需要動態(tài)調(diào)整內(nèi)存大小,從而避免浪費內(nèi)存。 但是,如果程序員不小心管理動態(tài)分配的內(nèi)存,就可能會導(dǎo)致內(nèi)存泄漏或者內(nèi)存溢出等問題,嚴(yán)重影響程序的性能和穩(wěn)定性。因此,使用動態(tài)內(nèi)存分配時需要注意內(nèi)存的釋放和管理。

常見的動態(tài)內(nèi)存分配函數(shù)有 malloccalloc、realloc 等。其中 malloc 分配指定大小的內(nèi)存塊,calloc 分配并初始化一定數(shù)量的內(nèi)存塊,realloc 可以重新調(diào)整已分配的內(nèi)存塊的大小。

二、為什么存在動態(tài)內(nèi)存分配

我們已經(jīng)掌握的內(nèi)存開辟方式有:

int val = 20;//在棧空間上開辟四個字節(jié)
char arr[10] = {0};//在??臻g上開辟10個字節(jié)的連續(xù)空間

但是上述的開辟空間的方式有兩個特點:

  1. 空間開辟大小是固定的。
  2. 數(shù)組在申明的時候,必須指定數(shù)組的長度,它所需要的內(nèi)存在編譯時分配。

但是對于空間的需求,不僅僅是上述的情況。
有時候我們需要的空間大小在程序運行的時候才能知道,
那數(shù)組的編譯時開辟空間的方式就不能滿足了。
這時候就只能試試動態(tài)存開辟了。

三、動態(tài)內(nèi)存函數(shù)的介紹


1. malloc

malloc函數(shù)在C語言中用于在程序運行時向內(nèi)存申請一塊指定大小的內(nèi)存空間。

函數(shù)格式:

void* malloc (size_t size);

其中,size_t是一個無符號整數(shù)類型,用于表示申請內(nèi)存的字節(jié)數(shù)。malloc函數(shù)返回一個void指針,指向分配的內(nèi)存空間的起始地址。如果分配失敗,malloc函數(shù)返回空指針NULL。

函數(shù)特點:

  • 如果開辟成功,則返回一個指向開辟好空間的指針。
  • 如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。
  • 返回值的類型是 void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時候使用者自己來決定。
  • 如果參數(shù) size 為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。

使用malloc函數(shù)申請內(nèi)存時,需要注意以下幾點:

1. 申請的內(nèi)存大小應(yīng)該是變量或數(shù)據(jù)類型的字節(jié)數(shù)乘以需要存儲或操作的元素個數(shù),以保證申請到足夠的內(nèi)存空間。
2. 申請到的內(nèi)存空間必須使用free函數(shù)進(jìn)行釋放,否則會導(dǎo)致內(nèi)存泄露。
3. 申請到的內(nèi)存空間不會被自動初始化,即其中的數(shù)據(jù)是隨機(jī)的,需要手動進(jìn)行初始化。

舉例演示:

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

int main() {
    int *p;
    p = (int*)malloc(10*sizeof(int)); //申請10個int類型數(shù)據(jù)的內(nèi)存空間
    if (p == NULL) { //判斷申請是否成功
        printf("Memory allocation failed.");
        exit(1);
    }
    for (int i = 0; i < 10; i++) { //手動初始化數(shù)據(jù)
        *(p+i) = i;
    }
    for (int i = 0; i < 10; i++) { //輸出數(shù)據(jù)
        printf("%d\t", *(p+i));
    }
    free(p); //釋放內(nèi)存空間
    p=NULL;  //將指針置為空
    return 0;
}
 

2. free

free 函數(shù)是 C 語言中用來釋放動態(tài)分配的內(nèi)存的函數(shù)

函數(shù)格式:

void free (void* ptr);

其中,ptr 是之前調(diào)用 malloc、calloc 或 realloc函數(shù)返回的指針。調(diào)用 free 函數(shù)后,指針?biāo)赶虻膬?nèi)存將會被操作系統(tǒng)回收,可以再次被分配給其他程序使用。
函數(shù)特點:

  • 如果參數(shù) ptr 指向的空間不是動態(tài)開辟的,那free函數(shù)的行為是未定義的。
  • 如果參數(shù) ptr 是NULL指針,則函數(shù)什么事都不做。

使用 free 函數(shù)的時候需要注意以下幾點:

1. 只能釋放動態(tài)分配的內(nèi)存,不能釋放?;蛉肿兞恐械膬?nèi)存。
2. 如果多次釋放同一個指針,會導(dǎo)致程序異常。
3. 如果指針為空指針(NULL),則不會進(jìn)行任何操作。

3. calloc

calloc函數(shù)是C語言中的一個內(nèi)存分配函數(shù),用于在內(nèi)存中分配指定大小的連續(xù)空間,并將其中的每個字節(jié)都初始化為0。
函數(shù)格式:

void* calloc (size_t num, size_t size);

其中,num表示要分配的元素數(shù)量,size表示每個元素的大小。函數(shù)返回一個指向新分配內(nèi)存的指針,如果分配失敗則返回NULL。
函數(shù)特點:

  • 與函數(shù) malloc 的區(qū)別只在于 calloc 會在返回地址之前把申請的空間的每個字節(jié)初始化為全0。
  • 與malloc函數(shù)不同,calloc函數(shù)在分配內(nèi)存時會自動清空分配的內(nèi)存空間,所以一般用于需要初始化內(nèi)存的情況。但它的缺點是比malloc函數(shù)慢,因為它需要在分配內(nèi)存時進(jìn)行清空操作。

使用calloc函數(shù)申請內(nèi)存時,需要注意以下幾點:

1. 申請的內(nèi)存大小應(yīng)該是變量或數(shù)據(jù)類型的字節(jié)數(shù)乘以需要存儲或操作的元素個數(shù),以保證申請到足夠的內(nèi)存空間。
2. 申請到的內(nèi)存空間必須使用free函數(shù)進(jìn)行釋放,否則會導(dǎo)致內(nèi)存泄露。
3. 申請到的內(nèi)存空間不會被自動初始化,即其中的數(shù)據(jù)是隨機(jī)的,需要手動進(jìn)行初始化。
4. 區(qū)別于malloc,calloc 會在返回地址之前把申請的空間的每個字節(jié)初始化為全0。

舉例演示:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int* p = (int*)calloc(10, sizeof(int));
	if (NULL != p)
	{
		//使用空間
	}
	free(p);
	p = NULL;
	return 0;
}

C語言 — 動態(tài)內(nèi)存管理(動態(tài)內(nèi)存函數(shù)),C語言,c語言,算法,c++,后端,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)
如何對申請的內(nèi)存空間的內(nèi)容要求初始化,那么可以很方便的使用calloc函數(shù)來完成任務(wù)


4. realloc

realloc函數(shù)是C語言中的一個庫函數(shù),用于重新分配動態(tài)分配的內(nèi)存空間。
1.用于調(diào)整現(xiàn)有的內(nèi)存塊大小、
2.分配新的內(nèi)存塊
3.用于釋放現(xiàn)有的內(nèi)存塊,當(dāng)傳遞給它一個空指針時。

函數(shù)格式:

void* realloc(void* ptr, size_t size);

ptr表示指向已經(jīng)動態(tài)分配的內(nèi)存塊的指針。
size表示需要重新分配的內(nèi)存塊的新尺寸。
返回值:如果分配失敗,則返回NULL指針;否則返回一個新的指針,指向重新分配后的內(nèi)存塊。

函數(shù)特點:

使用realloc函數(shù)申請內(nèi)存時,需要注意以下幾點:

1. 如果新的尺寸大于舊的尺寸,realloc函數(shù)將在原來的內(nèi)存塊后面分配額外的內(nèi)存,使其達(dá)到新的尺寸。
2. 如果新的尺寸小于舊的尺寸,realloc函數(shù)將會釋放一部分內(nèi)存,使其達(dá)到新的尺寸。
3. 如果ptr是空指針,則等同于調(diào)用malloc函數(shù)。如果size是0,等同于調(diào)用free函數(shù)。

realloc在調(diào)整內(nèi)存空間的是存在兩種情況:

  • 情況1:原有空間之后有足夠大的空間
  • 情況2:原有空間之后沒有足夠大的空間
    C語言 — 動態(tài)內(nèi)存管理(動態(tài)內(nèi)存函數(shù)),C語言,c語言,算法,c++,后端,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

情況1:
當(dāng)是情況1 的時候,要擴(kuò)展內(nèi)存就直接原有內(nèi)存之后直接追加空間,原來空間的數(shù)據(jù)不發(fā)生變化。

情況2:
當(dāng)是情況2 的時候,原有空間之后沒有足夠多的空間時,
擴(kuò)展的方法是:在堆空間上另找一個合適大小的連續(xù)空間來使用。這樣函數(shù)返回的是一個新的內(nèi)存地址。
由于上述的兩種情況,realloc函數(shù)的使用就要注意一些。

四、C/C++程序的內(nèi)存開辟

C語言 — 動態(tài)內(nèi)存管理(動態(tài)內(nèi)存函數(shù)),C語言,c語言,算法,c++,后端,開發(fā)語言,數(shù)據(jù)結(jié)構(gòu)

1. 內(nèi)存分配區(qū)域

C/C++程序內(nèi)存分配的幾個區(qū)域:

棧區(qū)(stack) 在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。 棧區(qū)主要存放運行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回數(shù)據(jù)、返回地址等。
堆區(qū)(heap) 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。分配方式類似于鏈表。
數(shù)據(jù)段 (靜態(tài)區(qū))(static) 存放全局變量、靜態(tài)數(shù)據(jù)。程序結(jié)束后由系統(tǒng)釋放。
代碼段 存放函數(shù)體(類成員函數(shù)和全局函數(shù))的二進(jìn)制代碼。

總結(jié)

本期博客的重要點概況:
malloc函數(shù):用于動態(tài)內(nèi)存的開辟
calloc函數(shù):也是用于動態(tài)內(nèi)存開辟,區(qū)別于malloc,calloc函數(shù)會將每一個字節(jié)初始化為0
realloc函數(shù):用于擴(kuò)展內(nèi)存空間,需要注意增加內(nèi)存的返回,分為情況1和2
free函數(shù):用于釋放動態(tài)內(nèi)存空間


如這篇博客對大家有幫助的話,希望 三連 支持一下 ?。。?如果有錯誤感謝大佬的斧正 如有 其他見解發(fā)到評論區(qū),一起學(xué)習(xí) 一起進(jìn)步。文章來源地址http://www.zghlxwxcb.cn/news/detail-631011.html

到了這里,關(guān)于C語言 — 動態(tài)內(nèi)存管理(動態(tài)內(nèi)存函數(shù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 解密動態(tài)內(nèi)存管理的奧秘(含內(nèi)存4個函數(shù))

    解密動態(tài)內(nèi)存管理的奧秘(含內(nèi)存4個函數(shù))

    目錄 一.為什么存在動態(tài)內(nèi)存管理 二.動態(tài)內(nèi)存函數(shù)的介紹 1. malloc函數(shù)(memory? alloc? 內(nèi)存開辟) 函數(shù)介紹: malloc函數(shù)使用舉例代碼: 2.free(釋放)? 函數(shù)介紹: 代碼的示例: 3.calloc 函數(shù)介紹: 代碼示例: 運行結(jié)果: 4.realloc 函數(shù)介紹: 使用示例代碼: 常見的動態(tài)內(nèi)存管

    2024年02月16日
    瀏覽(20)
  • 【C語言】free()函數(shù)詳解(動態(tài)內(nèi)存釋放函數(shù))

    【C語言】free()函數(shù)詳解(動態(tài)內(nèi)存釋放函數(shù))

    ?? 個人主頁 :修修修也 ?? 所屬專欄 :C語言 ?? 操作環(huán)境 : Visual Studio 2022 目錄 ?一.free()函數(shù)簡介 1.函數(shù)功能 2.函數(shù)參數(shù) void * ptr 3.函數(shù)返回值 4.函數(shù)頭文件 二.free()函數(shù)的具體使用 1.使用free()函數(shù)完成malloc()開辟空間的釋放 2.使用free()函數(shù)完成calloc()開辟空間的釋放 3.使用

    2024年02月08日
    瀏覽(21)
  • 「探索C語言內(nèi)存:動態(tài)內(nèi)存管理解析」

    「探索C語言內(nèi)存:動態(tài)內(nèi)存管理解析」

    ??先贊后看,不足指正!?? ??這將對我有很大的幫助!?? ??所屬專欄:C語言知識 ??阿哇旭的主頁:Awas-Home page 目錄 ? 引言 1.?靜態(tài)內(nèi)存 2.?動態(tài)內(nèi)存 2.1?動態(tài)內(nèi)存開辟函數(shù) 2.1.1 malloc函數(shù) 2.1.2?calloc函數(shù) 2.1.3?realloc函數(shù) 2.2 動態(tài)內(nèi)存釋放函數(shù) 2.2.1 free函數(shù) 3. 動態(tài)內(nèi)存的常見

    2024年04月28日
    瀏覽(25)
  • C語言 malloc動態(tài)內(nèi)存分配函數(shù)

    malloc函數(shù):malloc時動態(tài)內(nèi)存分配函數(shù),用于申請一塊連續(xù)的指定大小的內(nèi)存塊區(qū)域以void*類型返回分配的內(nèi)存區(qū)域地址,就是當(dāng)數(shù)組創(chuàng)建長度不一定 害怕數(shù)據(jù)存儲不夠或者不能浪費時間 在使用malloc開辟空間時,使用完成一定要釋放空間,如果不釋放會造內(nèi)存泄漏。n在使用ma

    2024年02月07日
    瀏覽(17)
  • [C語言][數(shù)據(jù)結(jié)構(gòu)][動態(tài)內(nèi)存空間的開辟]順序表的實現(xiàn)!

    [C語言][數(shù)據(jù)結(jié)構(gòu)][動態(tài)內(nèi)存空間的開辟]順序表的實現(xiàn)!

    目錄 零.必備知識 a.順序表的底層是數(shù)組. b.數(shù)組在內(nèi)存中是連續(xù)存放的. c.動態(tài)內(nèi)存空間的開辟(malloc,calloc,realloc). 一.順序表的定義與實現(xiàn)? ????????1.1 順序表的定義? ????????1.2 順序表的初始化? ????????1.3 順序表的銷毀? ????????1.4 順序表容量的檢查與調(diào)整

    2024年04月09日
    瀏覽(37)
  • 動態(tài)內(nèi)存管理 --- C語言

    動態(tài)內(nèi)存管理 --- C語言

    目錄 1.為什么存在動態(tài)內(nèi)存管理 2.動態(tài)內(nèi)存函數(shù)的介紹 2.1 malloc 與 free? 2.2 calloc 2.3 realloc 3.常見的動態(tài)內(nèi)存錯誤 4.幾個經(jīng)典筆試題 6.柔性數(shù)組 我們已經(jīng)掌握的內(nèi)存開辟方式有: 但是上述的開辟空間的方式有兩個特點: 空間開辟的 大小是固定的 。 數(shù)組在聲明的時候, 必須指

    2024年02月11日
    瀏覽(34)
  • 動態(tài)內(nèi)存管理(C語言)

    動態(tài)內(nèi)存管理(C語言)

    我們已經(jīng)掌握的內(nèi)存開辟方式有 int val = 20;//在棧空間上開辟四個字節(jié) char arr[10] = {0};//在??臻g上開辟10個字節(jié)的連續(xù)空間 但上述開辟內(nèi)存的方式有兩個特點 空間開辟大小是固定的 數(shù)組在聲明時必須指定數(shù)組的長度,他所需要的內(nèi)存在編譯時分配 但是對于空間的需求,不僅

    2024年02月16日
    瀏覽(25)
  • 動態(tài)內(nèi)存管理-c語言

    動態(tài)內(nèi)存管理-c語言

    目錄 1.為什么要有動態(tài)內(nèi)存分配 2.malloc函數(shù)和free函數(shù) malloc 函數(shù)原型 栗子 free 函數(shù)原型 栗子 3.calloc和***realloc*** 3.1calloc函數(shù) 原型如下: 栗子 3.2***recalloc*** 第一種情況 第二種情況 第三種情況 recalloc模擬實現(xiàn)calloc函數(shù) 4.六大常?的動態(tài)內(nèi)存的錯誤 4.1對NULL指針的解引?操作

    2024年03月22日
    瀏覽(28)
  • C語言->動態(tài)內(nèi)存管理

    C語言->動態(tài)內(nèi)存管理

    文章目錄 ??作者簡介:大家好,我是橘橙黃又青,一個想要與大家共同進(jìn)步的男人???? ??個人主頁:橘橙黃又青_C語言,函數(shù),指針-CSDN博客 目的:學(xué)習(xí)malloc,free,calloc,realloc函數(shù)的使用。 內(nèi)存函數(shù)在#includestdio.h頭文件里面。 我們已經(jīng)掌握的內(nèi)存開辟?式有: 但是上述的

    2024年02月04日
    瀏覽(21)
  • c語言-動態(tài)內(nèi)存管理

    c語言-動態(tài)內(nèi)存管理

    1.我們一般的開辟空間方式: 2.這樣開辟空間的特點 (1)申請的空間大小是固定的 (2)像數(shù)組那樣一開始就要確定大小,一旦確定大小就不能改變了 3.動態(tài)內(nèi)存 對于程序來說上述的內(nèi)存申請是不能滿足 因此為了能夠?qū)?nèi)存進(jìn)行調(diào)整,C語言引入了動態(tài)內(nèi)存開辟,讓程序員自

    2024年02月04日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包