亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中的動態內存分配實例分析

發布時間:2022-07-01 10:31:30 來源:億速云 閱讀:109 作者:iii 欄目:開發技術

本篇內容主要講解“C語言中的動態內存分配實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C語言中的動態內存分配實例分析”吧!

什么是動態內存分配

我們目前已經知道的內存開辟的方式有:

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

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

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

2.數組在申明的時候,必須指定數組長度,它所需內存在編譯時分配。

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

如何進行動態內存分配

首先我要介紹兩個函數 malloc 和 free

void* malloc(size_t size);

這個函數向內存申請一塊連續可用的空間,并返回指向這塊空間的指針。

  • 如果開辟成功,則返回一個指向開辟好空間的指針。

  • 如果開辟失敗,則返回一個NULL指針,因此malloc的返回值一定要做檢查。

  • 返回值的類型是void*,所以malloc函數并不知道開辟空間的類型,具體在使用的時候由使用者來決定

  • 如果參數size為0,malloc的行為是標準未定義的,取決于編譯器。

現在我們知道了如何去開辟空間,接下來,我們去學習一下如何將開辟的空間釋放掉。

void free(void* ptr);

C語言提供了另外一個函數free是專門用來釋放動態內存的

  • 如果參數ptr指向的空間不是動態內存開辟的,那么free的行為是未定義的。

  • 如果參數ptr是NULL指針,那么函數什么都不會做。

想使用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;
}

第二個開辟空間的動態內存分配的函數 calloc

void* calloc(size_t num, size_t size);

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

malloc與calloc的區別在于calloc會在返回地址之前把申請的空間的每個字節都初始化為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;
}

C語言中的動態內存分配實例分析

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

大小修改函數realloc

有時候我們會發現之前申請的空間太小,有時又會覺得申請的空間過大,那為了合理的使用內存,我們一定會對內存的大小做靈活調整。realloch函數就可以對動態開辟的內存大小進行調整

void* realloc(void* ptr, size_t size);
  • ptr 是要調整的內存地址

  • size 調整之后的新大小

  • realloc在調整內存空間后的返回值有兩種情況

情況一:原有空間之后有足夠大的空間,要擴展內存就直接在原有內存之后追加空間,原有空間的數據不變。

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

C語言中的動態內存分配實例分析

到此,相信大家對“C語言中的動態內存分配實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西贡区| 定西市| 曲水县| 浏阳市| 渝北区| 桂林市| 金坛市| 藁城市| 平顶山市| 嘉兴市| 丰都县| 潼关县| 武安市| 微山县| 玛曲县| 乐安县| 祁东县| 武夷山市| 新化县| 綦江县| 湛江市| 延川县| 阿勒泰市| 布尔津县| 景谷| 中方县| 扶绥县| 新邵县| 清水河县| 博客| 宣威市| 黄梅县| 崇仁县| 洛浦县| 如东县| 大厂| 肇源县| 贡觉县| 肥城市| 连山| 宣城市|