最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配

 更新時(shí)間:2022年06月29日 15:24:32   作者:。菀枯。  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,需要的可以參考一下

今天我們來學(xué)習(xí)一下C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配 開始學(xué)習(xí)吧

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

我們目前已經(jīng)知道的內(nèi)存開辟的方式有:

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

但是上述空間的開辟方式有兩個(gè)特點(diǎn):

1.空間開辟的大小是固定的

2.數(shù)組在申明的時(shí)候,必須指定數(shù)組長(zhǎng)度,它所需內(nèi)存在編譯時(shí)分配。

顯然,這樣無法滿足有些場(chǎng)景的要求,有時(shí)我們所需要的空間大小只有在程序運(yùn)行的時(shí)候才知道。這時(shí)我們就需要用到動(dòng)態(tài)內(nèi)存分配了。

如何進(jìn)行動(dòng)態(tài)內(nèi)存分配

首先我要介紹兩個(gè)函數(shù) malloc 和 free

void* malloc(size_t size);

這個(gè)函數(shù)向內(nèi)存申請(qǐng)一塊連續(xù)可用的空間,并返回指向這塊空間的指針。

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

現(xiàn)在我們知道了如何去開辟空間,接下來,我們?nèi)W(xué)習(xí)一下如何將開辟的空間釋放掉。

void free(void* ptr);

C語(yǔ)言提供了另外一個(gè)函數(shù)free是專門用來釋放動(dòng)態(tài)內(nèi)存的

  • 如果參數(shù)ptr指向的空間不是動(dòng)態(tài)內(nèi)存開辟的,那么free的行為是未定義的。
  • 如果參數(shù)ptr是NULL指針,那么函數(shù)什么都不會(huì)做。

想使用malloc 和 free 都需要引入一個(gè)頭文件<stdlib.h>

接下來讓我們看個(gè)示例:

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

int main()
{
    int num = 0;
    scanf("%d", &num);
    int *ptr = (int*)malloc(sizeof(int) * num);
    //判斷是否開辟成功
    if(NULL != ptr)
    {
        int i = 0;
        for(i = 0; i < num; i++)
        {
            *(ptr + i) = 0;
        }
    }
    free(ptr);//釋放空間
    ptr = NULL;
    return 0;
}

第二個(gè)開辟空間的動(dòng)態(tài)內(nèi)存分配的函數(shù) calloc

void* calloc(size_t num, size_t size);

函數(shù)的功能是為num個(gè)大小為size的元素開辟一塊空間,并且把空間的每個(gè)字節(jié)都初始化為0

malloc與calloc的區(qū)別在于calloc會(huì)在返回地址之前把申請(qǐng)的空間的每個(gè)字節(jié)都初始化為0

舉個(gè)例子:

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

int main()
{
    int *p = (int*)calloc(10, sizeof(int));
    if(NULL != p)
    {
        int i = 0;
        for(i = 0; i < 10; i++)
        {
            *(ptr + i) = 0;
        }
    }
    free(p);
    p = NULL;
    retrun 0;
}

所以如果我們對(duì)申請(qǐng)的內(nèi)存空間的內(nèi)容要求初始化,那么可以很方便的使用calloc函數(shù)來完成任務(wù)。

大小修改函數(shù)realloc

有時(shí)候我們會(huì)發(fā)現(xiàn)之前申請(qǐng)的空間太小,有時(shí)又會(huì)覺得申請(qǐng)的空間過大,那為了合理的使用內(nèi)存,我們一定會(huì)對(duì)內(nèi)存的大小做靈活調(diào)整。realloch函數(shù)就可以對(duì)動(dòng)態(tài)開辟的內(nèi)存大小進(jìn)行調(diào)整

void* realloc(void* ptr, size_t size);
  • ptr 是要調(diào)整的內(nèi)存地址
  • size 調(diào)整之后的新大小
  • realloc在調(diào)整內(nèi)存空間后的返回值有兩種情況

情況一:原有空間之后有足夠大的空間,要擴(kuò)展內(nèi)存就直接在原有內(nèi)存之后追加空間,原有空間的數(shù)據(jù)不變。

情況二:原有空間之后無足夠大的空間,擴(kuò)展方法是在堆上另找一塊連續(xù)的空間來使用,這樣函數(shù)返回的就是一個(gè)新的內(nèi)存地址

以上就是深入了解C語(yǔ)言中的動(dòng)態(tài)內(nèi)存分配的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

祁门县| 安乡县| 射阳县| 漯河市| 承德县| 甘孜县| 读书| 宜章县| 常宁市| 宝山区| 张家川| 尼木县| 仙桃市| 祥云县| 成武县| 松江区| 庄浪县| 三明市| 克拉玛依市| 株洲市| 绥德县| 南皮县| 贞丰县| 临猗县| 松阳县| 江达县| 肇庆市| 金沙县| 玉门市| 周口市| 安义县| 徐闻县| 绥滨县| 历史| 陆良县| 夏邑县| 唐河县| 开封市| 西平县| 许昌县| 抚顺县|