C語言基礎(chǔ)入門必讀---內(nèi)存分配

首先,我們應(yīng)該知道。所有的程序都必須留出足夠的內(nèi)存空間來存儲所使用的數(shù)據(jù),所以我們常常會預(yù)先給程序開辟好內(nèi)存空間,然后進(jìn)行操作,比如我們平常使用的數(shù)組就是這樣子的。數(shù)組我們在定義的時候必須給提前開辟好空間。而且在程序運行的過程中,這個開辟的內(nèi)存空間是一直存在的。除非等到這個函數(shù)運行完成,系統(tǒng)才會將空間釋放。但事實上另一個問題就是這個數(shù)組在程序中無法被改動。另一種選擇,能夠讓內(nèi)存分配自己主動進(jìn)行下去。下面我就來介紹在C語言中如何動態(tài)分配內(nèi)存。

內(nèi)存分配實例

1.從靜態(tài)區(qū)分配內(nèi)存

靜態(tài)區(qū)是用來存放全局初始化變量和為初始化變量,如果我們定義一個變量,系統(tǒng)會自動的在靜態(tài)區(qū)為其分配內(nèi)存空間。如:

#include"stdio.h"
//全局變量存在靜態(tài)區(qū)
int a, b, c, d;
int array[10] = { 0 };

int main() 
{
    return 0;
}

例子中的a b c d就是在靜態(tài)區(qū)分配內(nèi)存空間的。

2.從棧中分配內(nèi)存

棧內(nèi)存在函數(shù)中定義的一些基本類型的變量和對象的引用變量(形參 地址等)都在函數(shù)的棧內(nèi)存中分配。如:

#include"stdio.h"
//全局變量存在靜態(tài)區(qū)
int a, b, c, d;
int array[10] = { 0 };

int main() 
{
    int temp = 0;
    char name[20] = { "Hello Word!" };

    return 0;
}

temp name這些變量就是在棧上定義的變量,但是需要注意的是,定義的內(nèi)存不能超過棧的內(nèi)存,否則會導(dǎo)致棧內(nèi)存的泄露。

3.從堆中分配內(nèi)存

在C語言中,想要從堆中分配內(nèi)存就要調(diào)用mallo函數(shù)進(jìn)行分配

#include"stdio.h"
#include <malloc.h>
//全局變量存在靜態(tài)區(qū)
int a, b, c, d;
int array[10] = { 0 };
int main() 
{
    int temp = 0;
    char naame[20] = { "Hello Word!" };

    //從堆中分配內(nèi)存,表示從堆上分配30個double大小的內(nèi)存空間
    char* p;
    p = (char*)malloc(30 * sizeof(char));

    //判斷內(nèi)存是否分配成功
    if (p==NULL)
    {
        //分配失敗
        return 0;
    }
    //"HelloWorld\n"寫入p指向的地址
    sprintf(p, "%s", "HelloWorld\n");
    //輸出數(shù)據(jù)
    printf("%s\n", p);
    //釋放內(nèi)存空間
    free(p);
    return 0;
}

4.calloc()函數(shù)和realloc()函數(shù)

calloc()函數(shù)與malloc()函數(shù)有同樣之處。也有類似之處。

short *p;
newmem=(short *)calloc(1000,sizeof(short));

通過這個樣例,我們能夠知道calloc()函數(shù)有兩個參數(shù)。而且這兩個函數(shù)都是size_t類型(unsigned int類型)的數(shù)。第一個參數(shù)在這里所說的是所須要開辟的內(nèi)存單元數(shù)量。第二個參數(shù)是每一個單元的字節(jié)的大小。

void *calloc(size_t ,size_t);

calloc()函數(shù)另一個特性。它將塊中的所有位都置為0。這也是calloc()函數(shù)和malloc()函數(shù)的差別,calloc()函數(shù)和malloc()函數(shù)的另外一個差別是他們請求內(nèi)存數(shù)量的方式不一樣。當(dāng)然。free()函數(shù)也能夠來釋放calloc()函數(shù)分配的內(nèi)存。
realloc()函數(shù)用來改動一個原先已經(jīng)分配的內(nèi)存的大小。使用這個函數(shù),你能夠讓一塊內(nèi)存增大還是縮小。當(dāng)擴(kuò)大時。這塊內(nèi)存原先的內(nèi)容會依舊保留,新添加的加入到原先的后面。縮小時,該內(nèi)存的尾部部分內(nèi)存去掉,剩余保留。

注意:對于realloc()函數(shù)。假設(shè)原先的內(nèi)存無法改動。這時候realloc()函數(shù)再會分配一塊內(nèi)存。而且把原先那塊內(nèi)存的內(nèi)容拷貝到上面去。所以。使用了realloc函數(shù)以后,你這時候在使用的就該是realloc函數(shù)返回的新指針了。當(dāng)realloc函數(shù)的第一個參數(shù)是NULL時,這時候我們能夠把它當(dāng)作是malloc()函數(shù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容