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

C語言動態(tài)內(nèi)存規(guī)劃詳解

 更新時間:2021年10月09日 10:36:16   作者:aiyubaobei  
這篇文章主要介紹了C語言動態(tài)內(nèi)存的規(guī)劃,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

動態(tài)內(nèi)存規(guī)劃

用C語言寫程序時,因為語言的一些特性使用數(shù)組的時候只能用常量來申明數(shù)組,就導(dǎo)致數(shù)組的內(nèi)存被卡得很死,不能根據(jù)我們的實際需求靈活的使用內(nèi)存空間。有些空間的大小在程序運行時才能知道,那數(shù)組的編譯時開辟空間的方式就不能滿足了,這時候就只有動態(tài)開辟內(nèi)存

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

malloc函數(shù)

void* malloc(size_t size);

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

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

free函數(shù)

當(dāng)我們向內(nèi)存空間申請的空間 使用完之后一定要用free()函數(shù)將申請的內(nèi)存空間釋放掉,否則可能會導(dǎo)致內(nèi)存泄漏

void free(void* ptr)
  • 如果參數(shù)ptr指向的空間不是 動態(tài)開辟的,那free函數(shù)的行為是未定義的。
  • 如果參數(shù)ptr是NULL指針,則函數(shù)什么事都不用做。
// malloc函數(shù) 和 free函數(shù)的使用語法
#include<stdio.h>
#include<stdlib.h>
int main(){
    int* arr = (int*)malloc(sizeof(int)*10); // 因為malloc函數(shù)的返回值是void*所以要進(jìn)行強(qiáng)制類型轉(zhuǎn)換
    if(arr == NULL){  // 判斷內(nèi)存是否開辟成功
        printf("內(nèi)存開辟失敗\n");
        return;
    }
    int i = 0;
    for(i = 0; i < 10; i++){ // 將數(shù)據(jù)放進(jìn)我們開辟的空間中
        arr[i] = i;
    }
    for(i = 0; i < 10; i++){
        printf("%d",arr[i]); // 驗證數(shù)據(jù)是否放進(jìn)去了
    }
    free(arr);// 使用完空間后將它釋放
    arr = NULL;
    return 0;
}

在這里插入圖片描述

calloc函數(shù)

C語言還提供了一個函數(shù)叫做calloc,calloc函數(shù)也用來動態(tài)內(nèi)存分配

void* calloc(size_t num, size_t size);
  • 函數(shù)的功能是為 num個大小為size的元素開辟一塊空間,并且把空間的每個字節(jié)初始化為0
  • 與函數(shù)malloc的區(qū)別只在于calloc會在返回地址之前把申請的空間的每個字節(jié)初始化為全0
#include<stdio.h>
#include<stdlib.h>
int main(){
    int* arr = (int*)calloc(10, sizeof(int));
    if(NULL != arr){
        int i = 0;
        for(i = 0; i < sizeof(int)*10; i++){
            printf("%d ",*((char*)arr+i));
        }
    }
    free(arr);
    arr = NULL;
    return 0;
}

在這里插入圖片描述

realloc函數(shù)

realloc函數(shù)的出現(xiàn)讓動態(tài)內(nèi)存管理更加靈活,有時我們會發(fā)現(xiàn)之前申請的空間太小了不夠用,有時也會覺得申請的空間太大用不了那么多。為了能夠更加靈活的管理內(nèi)存我們可以使用realloc函數(shù)對開辟的內(nèi)存空間進(jìn)行調(diào)整

void* realloc(void* ptr, size_t size);
  • ptr是要調(diào)整的內(nèi)存地址
  • size是調(diào)整之后新的內(nèi)存大小
  • 這個函數(shù)調(diào)整原內(nèi)存空間大小的基礎(chǔ)上,還會將原來內(nèi)存中的數(shù)據(jù) 移動到新的空間
  • realloc在調(diào)整內(nèi)存空間的內(nèi)存時有兩種情況,**第一種情況:**原有空間之后足夠大的空間,這時會在原有空間之后的連續(xù)空間開辟新的空間。**第二種情況:**原有的空間之后沒有足夠大空間,這種情況是在堆空間上另找一個合適大小的連續(xù)空間來使用,這樣函數(shù)返回的是一個新的內(nèi)存地址。所以在用realloc函數(shù)調(diào)整空間的時候需要用一個臨時指針變量來存放realloc的返回值,再把變量有賦值給之前的指針變量
#include<stdio.h>
#include<stdlib.h>
int main(){
    int* arr = (int*)malloc(sizeof(10));
    if(NULL != arr){
        // 業(yè)務(wù)處理
    }
    // 當(dāng)開辟的空間用完時
    int* tmp = (int*)realloc(arr, sizeof(int)*20);
    if(NULL != tmp){
        arr = tmp;
    }
    return 0;
}

柔性數(shù)組

typedef struct arr_type{
    int i;
    int a[]; // 柔性數(shù)組成員
}type_arr;
  • 結(jié)構(gòu)體中的柔性數(shù)組成員前面必須至少有一個其他成員。
  • sizeof返回的 這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
  • 包含柔性數(shù)組成員的結(jié)構(gòu)用malloc函數(shù)進(jìn)行 內(nèi)存的動態(tài)分配,并且分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小
typedef struct arr{
    int i;
    int a[];
}arr;
printf("%d\n",sizeof(arr));// 輸出的是4

柔性數(shù)組的使用

int main() {
	struct rou_arr* ps = (struct rou_arr*)malloc(sizeof(int) + 10 * sizeof(int));
	if (ps == NULL) {
		printf("%s", strerror(errno));
	}
	ps->i = 10;
	int i = 0;
	for (i = 0; i < 10; i++) {
		ps->arr[i] = i;
	}
	for (i = 0; i < 10; i++) {
		printf("%d ", ps->arr[i]);
	}
	// 對柔性數(shù)組進(jìn)行擴(kuò)容
	struct rou_arr* ptr = (struct rou_arr*)realloc(ps, sizeof(int) + sizeof(int) * 20);
	if (ptr == NULL) {
		printf("realloc is failure\n");
		return -1;
	}
	ps = ptr;
	for (i = 0; i < 20; i++) {
		ps->arr[i] = i;
	}
	for (i = 0; i < 20; i++) {
		printf("%d ", ps->arr[i]);
	}
	return 0;
}

柔性數(shù)組的好處有兩個,一是方便內(nèi)存釋放,二是有利于訪問速度

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++中宏的使用問題詳解

    C++中宏的使用問題詳解

    宏替換是C/C++系列語言的技術(shù)特色,C/C++語言提供了強(qiáng)大的宏替換功能,源代碼在進(jìn)入編譯器之前,要先經(jīng)過一個稱為“預(yù)處理器”的模塊,這個模塊將宏根據(jù)編譯參數(shù)和實際編碼進(jìn)行展開,展開后的代碼才正式進(jìn)入編譯器,進(jìn)行詞法分析、語法分析等等。
    2016-05-05
  • C++類基本語法實例分析

    C++類基本語法實例分析

    這篇文章主要介紹了C++類基本語法實例分析,非常適合初學(xué)者學(xué)習(xí)借鑒,需要的朋友可以參考下
    2014-08-08
  • C++簡單實現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解

    C++簡單實現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解

    RPC是遠(yuǎn)程調(diào)用系統(tǒng)簡稱,它允許程序調(diào)用運行在另一臺計算機(jī)上的過程,就像調(diào)用本地的過程一樣。本文將用C++簡單實現(xiàn)RPC網(wǎng)絡(luò)通訊,感興趣的可以了解一下
    2023-04-04
  • C語言輾轉(zhuǎn)相除法求2個數(shù)的最小公約數(shù)

    C語言輾轉(zhuǎn)相除法求2個數(shù)的最小公約數(shù)

    輾轉(zhuǎn)相除法最大的用途就是用來求兩個數(shù)的最大公約數(shù)。下面通過本文給大家介紹C語言輾轉(zhuǎn)相除法求2個數(shù)的最小公約數(shù),非常不錯,感興趣的朋友一起看看吧
    2016-12-12
  • C語言實現(xiàn)哈夫曼樹

    C語言實現(xiàn)哈夫曼樹

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)哈夫曼樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言實現(xiàn)職工管理系統(tǒng)

    C語言實現(xiàn)職工管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 基于Matlab實現(xiàn)俄羅斯方塊游戲

    基于Matlab實現(xiàn)俄羅斯方塊游戲

    俄羅斯方塊是一個最初由阿列克謝帕吉特諾夫在蘇聯(lián)設(shè)計和編程的益智類視頻游戲。本文將利用Matlab實現(xiàn)這一經(jīng)典的小游戲,需要的可以參考一下
    2022-03-03
  • C語言之初識指針

    C語言之初識指針

    在C語言中,指針是一種保存變量地址的變量。這篇文章介紹了初識C語言指針,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C++11新特性之右值引用與完美轉(zhuǎn)發(fā)詳解

    C++11新特性之右值引用與完美轉(zhuǎn)發(fā)詳解

    C++11標(biāo)準(zhǔn)為C++引入右值引用語法的同時,還解決了一個短板,即使用簡單的方式即可在函數(shù)模板中實現(xiàn)參數(shù)的完美轉(zhuǎn)發(fā)。本文就來講講二者的應(yīng)用,需要的可以參考一下
    2022-09-09
  • C++超詳細(xì)講解構(gòu)造函數(shù)

    C++超詳細(xì)講解構(gòu)造函數(shù)

    C++的構(gòu)造函數(shù)的作?:初始化類對象的數(shù)據(jù)成員。即類的對象被創(chuàng)建的時候,編譯系統(tǒng)對該對象分配內(nèi)存空間,并?動調(diào)?構(gòu)造函數(shù),完成類成員的初始化。構(gòu)造函數(shù)的特點:以類名作為函數(shù)名,?返回類型
    2022-06-06

最新評論

喀什市| 乌拉特中旗| 定陶县| 新安县| 惠州市| 彭阳县| 青海省| 寻甸| 临洮县| 安康市| 乌恰县| 肇庆市| 阿尔山市| 博野县| 雅江县| 通河县| 新和县| 泗洪县| 怀安县| 云梦县| 扎囊县| 衡山县| 三原县| 苍溪县| 靖州| 松江区| 江门市| 康马县| 兴隆县| 亳州市| 临夏县| 邯郸市| 柘城县| 兴文县| 阆中市| 咸阳市| 湘西| 兰坪| 稷山县| 沧州市| 高陵县|