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

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

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

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

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

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

要么創(chuàng)建個變量,要么創(chuàng)建個數(shù)組。
這樣開辟出來的空間我們在使用的時候有時候會出現(xiàn)要么感覺空間過大,要么感覺空間過小,不夠靈活。
所以我們需要一種使空間可以變大變小的方法,這時候就出現(xiàn)了動態(tài)內(nèi)存開辟。

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

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

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

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

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

1.malloc函數(shù)

(1)malloc的定義

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

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

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

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

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

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

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

代碼如下:

#include<stdio.h>
 
//動態(tài)內(nèi)存開辟
int main()
{
	//假設(shè)開十個整型的空間 -- 10*sizeof(int)
	int arr[10];//棧區(qū)
	//動態(tài)內(nèi)存開辟
	int* p = (int*)malloc(10 * sizeof(int));
	//使用這些空間的時候
	if (p == NULL)
	{
		perror("main");//main:xxxxxxxxxxx(錯誤信息)
	}
	//使用
	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ù)使用,使用完之后要主動釋放這塊空間
	p = NULL;//釋放完了之后要把p置成空指針
	return 0;
}

2.calloc函數(shù)

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

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

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

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

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

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

代碼如下:

#include<stdio.h>
 
//動態(tài)內(nèi)存開辟
int main()
{
 
	int* p = calloc(10,sizeof(int));
	//使用這些空間的時候
	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ù)使用,使用完之后要主動釋放這塊空間
	p = NULL;//釋放完了之后要把p置成空指針
	return 0;
}

打印結(jié)果如下:

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

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

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

3.realloc函數(shù)

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

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

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

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

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

相關(guān)文章

  • C++ 的三種訪問權(quán)限與三種繼承方式

    C++ 的三種訪問權(quán)限與三種繼承方式

    我們知道C++中的類,有三種訪問權(quán)限(也稱作訪問控制),它們分別是public、protected、private,C++中繼承的方式還有多種。下面通過本文給大家詳細(xì)介紹,對c++中的訪問權(quán)限和繼承方式感興趣的朋友一起看看吧
    2016-11-11
  • 使用VS2010創(chuàng)建MFC ActiveX工程項目

    使用VS2010創(chuàng)建MFC ActiveX工程項目

    VS2010開發(fā)ActiveX有兩種方法,分別是MFC和ATL。MFC開過起來比較簡單,但是最終生成的文件比較大,ATL是專門用來開發(fā)ActiveX的,但是相對比較難,必須知道很多原理機制和API。咱先從MFC開發(fā)ActiveX開始吧。
    2015-06-06
  • 簡單分析針對ARM平臺的C語言程序的編譯問題

    簡單分析針對ARM平臺的C語言程序的編譯問題

    這篇文章主要介紹了針對ARM平臺的C語言程序的編譯問題,從優(yōu)化編譯選項的幾個方面進行分析,需要的朋友可以參考下
    2015-12-12
  • C語言零基礎(chǔ)講解指針和數(shù)組

    C語言零基礎(chǔ)講解指針和數(shù)組

    由于數(shù)據(jù)的表現(xiàn)形式多種多樣,還有字符型和其它的數(shù)值類型,因此僅有基本數(shù)據(jù)類型是不夠的。是否可以通過基本數(shù)據(jù)類型的組合抽象構(gòu)造其它的數(shù)據(jù)類型呢?下面是小編為大家?guī)淼腃語言數(shù)組與指針詳解的知識
    2022-04-04
  • C語言實現(xiàn)實時鐘表

    C語言實現(xiàn)實時鐘表

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)實時鐘表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Qt簡單實現(xiàn)密碼器控件

    Qt簡單實現(xiàn)密碼器控件

    這篇文章主要為大家詳細(xì)介紹了Qt簡單實現(xiàn)密碼器控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • visual studio 2019編譯c++17的方法

    visual studio 2019編譯c++17的方法

    這篇文章主要介紹了visual studio 2019編譯c++17的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Qt設(shè)計時鐘效果

    Qt設(shè)計時鐘效果

    這篇文章主要為大家詳細(xì)介紹了Qt設(shè)計時鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C/C++中g(shù)etline函數(shù)案例總結(jié)

    C/C++中g(shù)etline函數(shù)案例總結(jié)

    這篇文章主要介紹了C/C++中g(shù)etline函數(shù)案例總結(jié),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方

    零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方

    這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方,文中講解非常細(xì)致,供大家參考和學(xué)習(xí),想要學(xué)習(xí)C/C++的可以閱讀此文
    2020-06-06

最新評論