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

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

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

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

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

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

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

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

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

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

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

如何進行動態(tài)內(nèi)存分配

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

void* malloc(size_t size);

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

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

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

void free(void* ptr);

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

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

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

接下來讓我們看個示例:

#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;
}

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

void* calloc(size_t num, size_t size);

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

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

舉個例子:

#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;
}

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

大小修改函數(shù)realloc

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

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

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

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

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

相關(guān)文章

  • C語言實現(xiàn)學(xué)生信息管理系統(tǒng)

    C語言實現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語言實現(xiàn)自定義掃雷游戲(遞歸版)

    C語言實現(xiàn)自定義掃雷游戲(遞歸版)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)自定義掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言 指針綜合解析

    C語言 指針綜合解析

    指針可以表示一個變更的地址,在計算機程序中,通常表示內(nèi)存地址,存儲數(shù)據(jù)的地址,下面這篇文章主要給大家綜合的介紹了關(guān)于C語言指針的本質(zhì)與用法
    2021-11-11
  • c++用指針交換數(shù)組的實例講解

    c++用指針交換數(shù)組的實例講解

    下面小編就為大家分享一篇c++用指針交換數(shù)組的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • C++基于boost asio實現(xiàn)sync tcp server通信流程詳解

    C++基于boost asio實現(xiàn)sync tcp server通信流程詳解

    這篇文章主要介紹了C++基于boost asio實現(xiàn)sync tcp server通信的流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 編寫C語言程序進行進制轉(zhuǎn)換的問題實例

    編寫C語言程序進行進制轉(zhuǎn)換的問題實例

    這篇文章主要介紹了編寫C語言程序進行進制轉(zhuǎn)換的問題實例,文中附錄了一個各種進制間的轉(zhuǎn)換程序代碼,需要的朋友可以參考下
    2015-08-08
  • C++ continue和break語句

    C++ continue和break語句

    這篇文章主要介紹了C++ continue和break語句,文章圍繞continue和break語句的相關(guān)資料展開詳細內(nèi)容,需要的朋友可以參考一下,希望對大家有所幫助
    2021-11-11
  • c++中inline的用法分析

    c++中inline的用法分析

    本篇文章是對c++中inline的用法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 為什么要學(xué)習(xí)C語言 C語言優(yōu)勢分析

    為什么要學(xué)習(xí)C語言 C語言優(yōu)勢分析

    不止一個學(xué)生問到我:“老師,為什么我們的應(yīng)用程序設(shè)計要學(xué)C語言而不是別的?C語言不是已經(jīng)過時了嗎?如果現(xiàn)在要寫一個Windows程序,用VB或Dephi開發(fā)多快呀,用C行嗎?退一萬步,為什么選擇C而不是C++呢?”
    2013-07-07
  • 深入理解C語言 static、extern與指針函數(shù)

    深入理解C語言 static、extern與指針函數(shù)

    這篇文章主要介紹了C語言 static、extern與指針函數(shù),有需要的朋友可以參考一下
    2013-12-12

最新評論