溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

c語言實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配的方法是什么

發(fā)布時(shí)間:2020-04-26 14:03:57 來源:億速云 閱讀:268 作者:小新 欄目:編程語言

這篇文章主要為大家詳細(xì)介紹了c語言實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配的方法是什么,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

c語言怎么實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配

我們經(jīng)常會(huì)預(yù)先給程序開辟好內(nèi)存空間,然后進(jìn)行操作。

int arr[5] ;

對(duì)這個(gè)數(shù)組我們?cè)诙x的時(shí)候必須給提前開辟好空間,并且在程序執(zhí)行的過程中,這個(gè)開辟的內(nèi)存空間是一直存在的,除非等到這個(gè)函數(shù)執(zhí)行完畢,才會(huì)將空間釋放。有個(gè)問題就是這個(gè)數(shù)組在程序中無法被修改。

這些問題給我們?cè)斐闪艘恍┦褂蒙系牟环奖?,所以,C中提供了malloc()函數(shù)。

關(guān)于malloc()函數(shù),這個(gè)函數(shù)它接受一個(gè)參數(shù):就是所需的內(nèi)存的字節(jié)數(shù)。然后malloc()找到可用內(nèi)存中那一個(gè)大小適合的塊。在這個(gè)過程中,malloc()可以來返回那塊內(nèi)存第一個(gè)字節(jié)的地址。所以,也就意味了我們可以使用指針來操作。malloc()可以用來返回?cái)?shù)組指針、結(jié)構(gòu)指針等等,所以我們需要把返回值的類型指派為適當(dāng)?shù)念愋?。?dāng)malloc()找不到所需的空間時(shí),它將返回空指針。

例:

double *p;
p=(double*)malloc(30*sizeof(double));

在這個(gè)程序中,首先開辟了30個(gè)double類型的空間,然后把p指向這個(gè)空間的位置。在這里的指針是指向第一個(gè)double值。并不是我們?nèi)块_辟的30個(gè)double的空間。這就和數(shù)組一樣,指向數(shù)組的指針式指向數(shù)組首元素的地址,并不是整個(gè)數(shù)組的元素。所以,在這里我們的操作也和數(shù)組是一樣的,

p[0]就是第一個(gè)元素,p[1]就是第二個(gè)元素。

至此,我們就可以掌握到一種聲明動(dòng)態(tài)數(shù)組的方法。

int arr[n];
p=(int *)malloc(n*sizeof(int));
//我們?cè)谶@里使用的時(shí)候要元素個(gè)數(shù)乘類型字節(jié)長(zhǎng)度,這樣就達(dá)到了動(dòng)態(tài)開辟內(nèi)存空間。

當(dāng)我們使用malloc()開辟完內(nèi)存空間以后,我們所要考慮的就是釋放內(nèi)存空間,在這里,C給我們提供了free()函數(shù)。free()的參數(shù)就是malloc()函數(shù)所返回的地址,釋放先前malloc()函數(shù)所開辟的空間。

例:

對(duì)于上面我們所開辟的空間進(jìn)行釋放,那么我們就可以這樣

free(p);

程序還調(diào)用了exit()函數(shù),這個(gè)函數(shù)是在內(nèi)存分配失敗時(shí)結(jié)束程序。

程序例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>//malloc()函數(shù)被包含在malloc.h里面
#include<stdlib.h>
int main(void)
{
    char*a = NULL;//聲明一個(gè)指向a的char*類型的指針
    a = (char*)malloc(100 * sizeof(char));//使用malloc分配內(nèi)存的首地址,然后賦值給a
    if (!a)//如果malloc失敗,可以得到一些log
    {
        perror("malloc");
        return-1;
    }
    sprintf(a, "%s", "HelloWorld\n");//"HelloWorld\n"寫入a指向的地址
    printf("%s\n", a);//輸出用戶輸入的數(shù)據(jù)
    free(a);//釋放掉使用的內(nèi)存地址
    system("pause");
    return 0;//例2有無內(nèi)存泄露?
}

這個(gè)程序主要用來檢測(cè)malloc返回值條件有誤。

在這里我們需要注意,在C中,類型指派(char *)是可選的,但是在C++中這個(gè)是必須有的,所以使用類型指派將使把C程序移植到C++更容易。

使用動(dòng)態(tài)數(shù)組,主要是為了獲得程序的靈活性。我們可以需要多少個(gè)元素就讓數(shù)組開辟多少個(gè)。不需要浪費(fèi)空間。

關(guān)于c語言實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配的方法是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的參考價(jià)值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI