欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言動(dòng)態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解

 更新時(shí)間:2023年08月16日 09:31:52   作者:一個(gè)小腦袋  
在C語言中,動(dòng)態(tài)內(nèi)存函數(shù)是塊重要的知識(shí)點(diǎn),以往,我們開辟空間都是固定得,數(shù)組編譯結(jié)束后就不能繼續(xù)給它開辟空間了,開辟的空間滿了,就不能在開辟空間了,學(xué)習(xí)本文章,我們就可以解決這個(gè)問題,向內(nèi)存申請空間,感興趣的小伙伴跟著小編一起來看看吧

一、malloc函數(shù)

需要頭文件——<stdlib.h>

在這里插入圖片描述

瀏覽器直接翻譯:

在這里插入圖片描述

malloc函數(shù)(動(dòng)態(tài)內(nèi)存開辟的函數(shù)):

void* malloc(size_t size);

功能:

  • 這個(gè)函數(shù)向內(nèi)存申請一個(gè)連續(xù)可用的空間,并返回指向這塊空間的指針。
  • 如果開辟成功,則返回一個(gè)指向開辟好空間的指針。
  • 如果開辟失敗,則返回一個(gè)NULL指針,因此malloc的返回值一定要做檢查。
  • 返回值的類型是void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時(shí)候由使用者自己決定。
  • 如果size為0,malloc的行為是標(biāo)準(zhǔn)還是未定義的,由編譯器決定。
  • malloc申請的空間,當(dāng)程序退出時(shí),要還給操作系統(tǒng),當(dāng)程序不退出,動(dòng)態(tài)申請的內(nèi)存,不會(huì)主動(dòng)釋放,需要用free函數(shù)來釋放。
    malloc申請的內(nèi)存空間:
    malloc申請到空間后,直接返回這個(gè)空間的首地址,不會(huì)初始化空間的內(nèi)容。
    舉個(gè)例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//變長數(shù)組的知識(shí)點(diǎn)(vs不能用,gcc可以用)
    //int num = 0;
    //scanf("%d", &num);
    //int arr[num] = { 0 };
    int* ptr = NULL;
    ptr = (int*)malloc(40);
    if (ptr == NULL)//判斷ptr指針是否為空
    {
        perror("malloc");
        exit; 
    }
    else
    {
        int i = 0;
        for (i = 0; i < 10; i++)//給開辟的空間賦值
            ptr[i] = i + 1;
    }
    free(ptr);//釋放ptr指向的空間
    ptr = NULL;//讓ptr指向空
    return 0;
}

二、calloc函數(shù)

需要頭文件——<stdlib.h>

在這里插入圖片描述

瀏覽器直接翻譯:

在這里插入圖片描述

calloc函數(shù)(動(dòng)態(tài)內(nèi)存分配函數(shù)):

void* calloc(size_t num, size_t size);

功能:

  • 函數(shù)的功能是,為num個(gè)大小為size元素開辟一塊空間,并且把空間的每一個(gè)字節(jié)初始化為0.
  • 與malloc函數(shù)的區(qū)別,只在于calloc函數(shù)會(huì)在返回地址之前把申請空間的每一個(gè)字節(jié)初始化為0.

舉個(gè)例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int* p = (int*)calloc( 10,sizeof(int));
    if (p == NULL)//成立,開辟失敗
    {
        perror("calloc");
        exit;
    }
    free(p);
    p = NULL;
    return 0;
}

p指向的地址:

在這里插入圖片描述

三、realloc函數(shù)

需要頭文件——<stdlib.h>

在這里插入圖片描述

瀏覽器直接翻譯:

在這里插入圖片描述

realloc函數(shù)(動(dòng)態(tài)內(nèi)存管理更加靈活):

有時(shí)候我們發(fā)現(xiàn)過去申請的空間小了,有時(shí)候我們會(huì)覺得過去申請的空間過大,為了合理使用內(nèi)存,我們一定要對內(nèi)存的大小做靈活的調(diào)整。realloc函數(shù)可以做到對動(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)整后的新大小。
  • 返回值為調(diào)整之后的內(nèi)存起始位置。
  • 這個(gè)函數(shù)在調(diào)整原空間大小的基礎(chǔ)上,還會(huì)將原來的數(shù)據(jù)移到新的空間。

注意:

realloc調(diào)整內(nèi)存空間有兩種情況。

  • 情況1:原有空間之后有足夠大的空間(原地?cái)U(kuò)容)。當(dāng)是情況1的時(shí)候,要擴(kuò)展內(nèi)存就直接在原有內(nèi)存之后直接追加空間,原來空間的數(shù)據(jù)不發(fā)生改變。

在這里插入圖片描述

  • 情況2:原有空間后面沒有足夠大的空間(異地?cái)U(kuò)容)。當(dāng)是情況2的時(shí)候,原有空間后面沒有足夠多的空間時(shí),擴(kuò)展的方法是:在堆空間上另外找一個(gè)合適大小的連續(xù)空間來使用。這樣函數(shù)返回的是一個(gè)新的內(nèi)存地址。

在這里插入圖片描述

所以我們在使用realloc函數(shù)的時(shí)候一定要注意:

1、開辟新的空間。

2、 會(huì)將舊的空間數(shù)據(jù)拷貝到新的空間。

3、釋放舊的空間。

4、返回新空間的起始地址。

舉個(gè)例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int* ptr =(int*) malloc( 100 );
    if (ptr != NULL)
    {
//可以使用這個(gè)空間
    }
    else
    {
        perror("malloc");
        exit;
    }
    //擴(kuò)展空間
    int* p = (int*)realloc(ptr, 1000);//可能增容失敗
    if (p != NULL)
    {
        //增容成功
        ptr = p;//p指向的空間交給ptr去維護(hù)
    }
    free(ptr);//把開辟早堆上的空間釋放掉
    ptr = NULL;
    return 0;
}

四、free函數(shù)

需要頭文件——<stdlib.h>

在這里插入圖片描述

瀏覽器直接翻譯:

在這里插入圖片描述

free函數(shù)(釋放動(dòng)態(tài)開辟的內(nèi)存):

void* free(void* ptr);

功能:

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

到此這篇關(guān)于C語言動(dòng)態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解的文章就介紹到這了,更多相關(guān)C語言動(dòng)態(tài)內(nèi)存函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C語言編寫圣誕表白程序

    使用C語言編寫圣誕表白程序

    圣誕節(jié)快到了,讓我們用C語言制作一個(gè)圣誕表白程序吧,下面通過本文學(xué)習(xí)下實(shí)現(xiàn)代碼
    2016-12-12
  • 原碼, 反碼與補(bǔ)碼基礎(chǔ)知識(shí)詳細(xì)介紹

    原碼, 反碼與補(bǔ)碼基礎(chǔ)知識(shí)詳細(xì)介紹

    這篇文章講解了計(jì)算機(jī)的原碼, 反碼和補(bǔ)碼. 并且進(jìn)行了深入探求了為何要使用反碼和補(bǔ)碼, 以及更進(jìn)一步的論證了為何可以用反碼, 補(bǔ)碼的加法計(jì)算原碼的減法,需要的朋友可以參考下
    2016-12-12
  • c++定義全局變量詳解

    c++定義全局變量詳解

    這篇文章主要給大家介紹了C++語言中定義全局變量,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2021-10-10
  • Qt實(shí)現(xiàn)部件透明及陰影效果的示例代碼

    Qt實(shí)現(xiàn)部件透明及陰影效果的示例代碼

    本文主要介紹了Qt實(shí)現(xiàn)部件透明及陰影效果的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • VS報(bào)錯(cuò)C6011的問題:取消對NULL指針的引用(解決方法)

    VS報(bào)錯(cuò)C6011的問題:取消對NULL指針的引用(解決方法)

    這篇文章主要介紹了VS報(bào)錯(cuò)C6011的問題:取消對NULL指針的引用(解決方法),C6011:取消對NULL指針的引用,發(fā)現(xiàn)是沒有進(jìn)行空指針的判斷,解決方案跟隨小編一起看看吧
    2024-01-01
  • C語言實(shí)現(xiàn)學(xué)生獎(jiǎng)學(xué)金評(píng)定系統(tǒng)

    C語言實(shí)現(xiàn)學(xué)生獎(jiǎng)學(xué)金評(píng)定系統(tǒng)

    這篇文章主要介紹了C語言實(shí)現(xiàn)學(xué)生獎(jiǎng)學(xué)金評(píng)定系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • OpenCV實(shí)現(xiàn)給圖片添加邊框功能

    OpenCV實(shí)現(xiàn)給圖片添加邊框功能

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)給圖片添加邊框功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 詳解C++ 桶排序(BucketSort)

    詳解C++ 桶排序(BucketSort)

    這篇文章主要介紹了C++桶排序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C++使用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序算法示例

    C++使用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序算法示例

    這篇文章主要介紹了C++使用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序算法,結(jié)合實(shí)例形式分析了C++借助輔助棧實(shí)現(xiàn)棧排序算法的相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C語言編程簡單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解

    C語言編程簡單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解

    這篇文章主要為大家介紹了C語言編程中非常簡單卻又非常重要的數(shù)據(jù)結(jié)構(gòu)順序表的全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10

最新評(píng)論