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

C語(yǔ)言初識(shí)動(dòng)態(tài)內(nèi)存管理malloc calloc realloc free函數(shù)

 更新時(shí)間:2022年03月16日 10:42:06   作者:K穩(wěn)重  
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存

一、為什么存在動(dòng)態(tài)內(nèi)存分配

在c語(yǔ)言中我們目前掌握的內(nèi)存開(kāi)辟方式有:

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

要么創(chuàng)建個(gè)變量,要么創(chuàng)建個(gè)數(shù)組。
這樣開(kāi)辟出來(lái)的空間我們?cè)谑褂玫臅r(shí)候有時(shí)候會(huì)出現(xiàn)要么感覺(jué)空間過(guò)大,要么感覺(jué)空間過(guò)小,不夠靈活。
所以我們需要一種使空間可以變大變小的方法,這時(shí)候就出現(xiàn)了動(dòng)態(tài)內(nèi)存開(kāi)辟。

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

1. 空間開(kāi)辟大小是固定的。

2. 數(shù)組在申明的時(shí)候,必須指定數(shù)組的長(zhǎng)度,它所需要的內(nèi)存在編譯時(shí)分配。 但是對(duì)于空間的需求,不僅僅是上述的情況。有時(shí)候我們需要的空間大小在程序運(yùn)行的時(shí)候才能知道, 那數(shù)組的編譯時(shí)開(kāi)辟空間的方式就不能滿足了。 這時(shí)候就只能試試動(dòng)態(tài)存開(kāi)辟了。

二、動(dòng)態(tài)內(nèi)存函數(shù)的使用

首先我們要了解數(shù)據(jù),變量,函數(shù)是在內(nèi)存中怎么存放的,如下圖所示:

1.malloc函數(shù)

(1)malloc的定義

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

(2)malloc函數(shù)的注意事項(xiàng)

1.如果開(kāi)辟成功,則返回一個(gè)指向開(kāi)辟好空間的指針。

2.如果開(kāi)辟失敗,則返回一個(gè)NULL指針,因此malloc的返回值一定要做檢查。

3.返回值的類型是 void* ,所以malloc函數(shù)并不知道開(kāi)辟空間的類型,具體在使用的時(shí)候使用者自己 來(lái)決定。

4.如果參數(shù) size 為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。

(3)malloc函數(shù)的使用

代碼如下:

#include<stdio.h>
 
//動(dòng)態(tài)內(nèi)存開(kāi)辟
int main()
{
	//假設(shè)開(kāi)十個(gè)整型的空間 -- 10*sizeof(int)
	int arr[10];//棧區(qū)
	//動(dòng)態(tài)內(nèi)存開(kāi)辟
	int* p = (int*)malloc(10 * sizeof(int));
	//使用這些空間的時(shí)候
	if (p == NULL)
	{
		perror("main");//main:xxxxxxxxxxx(錯(cuò)誤信息)
	}
	//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = i;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d", p[i]);//p[i]-->*(p + i)
	}
	//回收空間
	free(p);//malloc函數(shù)要配合free函數(shù)使用,使用完之后要主動(dòng)釋放這塊空間
	p = NULL;//釋放完了之后要把p置成空指針
	return 0;
}

2.calloc函數(shù)

(1)calloc函數(shù)的定義

C語(yǔ)言還提供了一個(gè)函數(shù)叫 calloc , calloc 函數(shù)也用來(lái)動(dòng)態(tài)內(nèi)存分配。

(2)calloc函數(shù)的注意事項(xiàng)

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

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

(3)calloc函數(shù)的使用

代碼如下:

#include<stdio.h>
 
//動(dòng)態(tài)內(nèi)存開(kāi)辟
int main()
{
 
	int* p = calloc(10,sizeof(int));
	//使用這些空間的時(shí)候
	if (p == NULL)
	{
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d", p[i]);//p[i]-->*(p + i)
	}
	//回收空間
	free(p);//malloc函數(shù)要配合free函數(shù)使用,使用完之后要主動(dòng)釋放這塊空間
	p = NULL;//釋放完了之后要把p置成空指針
	return 0;
}

打印結(jié)果如下:

需要注意點(diǎn)就是,calloc函數(shù)和malloc函數(shù)相比有兩點(diǎn)不同,

1.calloc函數(shù)的參數(shù)為兩個(gè),malloc函數(shù)的參數(shù)為一個(gè)。?

2.malloc函數(shù)如果不初始化打印出來(lái)的都是隨機(jī)值,calloc函數(shù)不用初始化,會(huì)默認(rèn)把申請(qǐng)的空間每個(gè)字節(jié)初始化為0。

3.realloc函數(shù)

(1)realloc函數(shù)的定義

realloc函數(shù)的出現(xiàn)讓動(dòng)態(tài)內(nèi)存管理更加靈活。

有時(shí)會(huì)我們發(fā)現(xiàn)過(guò)去申請(qǐng)的空間太小了,有時(shí)候我們又會(huì)覺(jué)得申請(qǐng)的空間過(guò)大了,那為了合理的時(shí) 候內(nèi)存,我們一定會(huì)對(duì)內(nèi)存的大小做靈活的調(diào)整。

那 realloc 函數(shù)就可以做到對(duì)動(dòng)態(tài)開(kāi)辟內(nèi)存大小 的調(diào)整。

(2)realloc函數(shù)的注意事項(xiàng)

1.ptr 是要調(diào)整的內(nèi)存地址

2.size 調(diào)整之后新大小 返回值為調(diào)整之后的內(nèi)存起始位置。

3.這個(gè)函數(shù)調(diào)整原內(nèi)存空間大小的基礎(chǔ)上,還會(huì)將原來(lái)內(nèi)存中的數(shù)據(jù)移動(dòng)到 新 的空間。

4.realloc在調(diào)整內(nèi)存空間的是存在兩種情況:

情況1 當(dāng)是情況1 的時(shí)候,要擴(kuò)展內(nèi)存就直接原有內(nèi)存之后直接追加空間,原來(lái)空間的數(shù)據(jù)不發(fā)生變化。

情況2 當(dāng)是情況2 的時(shí)候,原有空間之后沒(méi)有足夠多的空間時(shí),擴(kuò)展的方法是:在堆空間上另找一個(gè)合適大小 的連續(xù)空間來(lái)使用。這樣函數(shù)返回的是一個(gè)新的內(nèi)存地址。 由于上述的兩種情況,realloc函數(shù)的使用就要注意一些。

(3)realloc函數(shù)的使用

#include<stdio.h>
 
//動(dòng)態(tài)內(nèi)存開(kāi)辟
int main()
{
 
	int* p = calloc(10,sizeof(int));
	//使用這些空間的時(shí)候
	if (p == NULL)
	{
		perror("main");
		return 1;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = 5;
	}//這里需要P指向的空間更大,需要20個(gè)int空間的大小
	//realloc調(diào)整空間大小
	int* ptr = realloc(p, 20 * sizeof(int*));
	if (ptr != NULL)
	{
		p = ptr;
	}
	//回收空間
	free(p);//malloc函數(shù)要配合free函數(shù)使用,使用完之后要主動(dòng)釋放這塊空間
	p = NULL;//釋放完了之后要把p置成空指針
	return 0;
}

總結(jié)

本文僅僅簡(jiǎn)單的介紹了動(dòng)態(tài)內(nèi)存函數(shù)的定義,注意事項(xiàng)和使用,還有free函數(shù)用來(lái)釋放動(dòng)態(tài)內(nèi)存開(kāi)辟的空間,然后置為空。文章如果有任何問(wèn)題,歡迎大佬提出疑問(wèn)。我會(huì)虛心學(xué)習(xí)和改正,最重要的是能共同進(jìn)步,共同成長(zhǎng),學(xué)好編程。

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

相關(guān)文章

  • QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng)

    QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)文件傳輸系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++設(shè)計(jì)模式之享元模式

    C++設(shè)計(jì)模式之享元模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之享元模式,本文講解了什么是享元模式、享元模式代碼實(shí)例、享元模式的優(yōu)點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言數(shù)組全面總結(jié)梳理

    C語(yǔ)言數(shù)組全面總結(jié)梳理

    在C語(yǔ)言和C++等語(yǔ)言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來(lái)指向若干個(gè)字符串,使字符串處理更加方便、靈活
    2022-02-02
  • C語(yǔ)言合并排序及實(shí)例代碼

    C語(yǔ)言合并排序及實(shí)例代碼

    本篇文章主要介紹C語(yǔ)言合并排序算法,這里對(duì)合并排序通過(guò)實(shí)例代碼進(jìn)行了詳細(xì)講解,希望能幫助到大家學(xué)習(xí)
    2016-07-07
  • C語(yǔ)言中魔性的float浮點(diǎn)數(shù)精度問(wèn)題

    C語(yǔ)言中魔性的float浮點(diǎn)數(shù)精度問(wèn)題

    這篇文章主要介紹了魔性的float浮點(diǎn)數(shù)精度問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 基于Qt編寫簡(jiǎn)易的視頻播放器

    基于Qt編寫簡(jiǎn)易的視頻播放器

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)編寫簡(jiǎn)易的視頻播放器,可以支持pbonon/qmediaplayer/ffmpeg/vlc/mpv等多種內(nèi)核,感興趣的可以學(xué)習(xí)一下
    2022-12-12
  • 關(guān)于C++的強(qiáng)制類型轉(zhuǎn)換淺析

    關(guān)于C++的強(qiáng)制類型轉(zhuǎn)換淺析

    C++的強(qiáng)制類型轉(zhuǎn)換是我們?cè)谌粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到的,下面這篇文章主要給大家介紹了關(guān)于C++強(qiáng)制類型轉(zhuǎn)換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 基于Qt實(shí)現(xiàn)Android的圖案密碼效果

    基于Qt實(shí)現(xiàn)Android的圖案密碼效果

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)Android的圖案密碼效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2024-12-12
  • C語(yǔ)言規(guī)避野指針的方法流程

    C語(yǔ)言規(guī)避野指針的方法流程

    野指針就是指針指向的不是一個(gè)有效(合法)的地址,在程序中,如果訪問(wèn)野指針,可能會(huì)造成程序的崩潰,這篇文章主要介紹了C語(yǔ)言如何規(guī)避野指針,需要的朋友可以參考下
    2024-03-03
  • C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法

    C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法

    本文主要介紹了C/C++寬窄字符轉(zhuǎn)換與輸出的多種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

西乡县| 柞水县| 邓州市| 金昌市| 习水县| 民权县| 巴彦淖尔市| 台南县| 谢通门县| 库尔勒市| 喀喇| 富顺县| 饶河县| 武山县| 同江市| 韶山市| 佛坪县| 景宁| 临沧市| 阜平县| 贵溪市| 汝城县| 共和县| 阿尔山市| 兰坪| 杭锦后旗| 太湖县| 全南县| 三门峡市| 临汾市| 五河县| 凤城市| 彭州市| 安平县| 财经| 盘山县| 惠州市| 德保县| 静宁县| 西乌珠穆沁旗| 读书|