c語言怎麼實現動態記憶體分配

angryTom
發布: 2020-02-20 11:43:00
原創
4927 人瀏覽過

c語言怎麼實現動態記憶體分配

c語言怎麼實作動態記憶體分配

我們常常會預先給程式開啟好記憶體空間,然後進行操作。

int arr[5] ;
登入後複製

對這個數組我們在定義的時候必須給提前開闢好空間,並且在程式執行的過程中,這個開闢的記憶體空間是一直存在的,除非等到這個函數執行完畢,才會將空間釋放。有個問題就是這個陣列在程式中無法被修改。

這些問題給我們造成了一些使用上的不方便,所以,C中提供了malloc()函數。

關於malloc()函數,這個函數它接受一個參數:就是所需的記憶體的位元組數。然後malloc()找到可用記憶體中那一個大小適合的區塊。在這個過程中,malloc()可以來回傳那塊記憶體第一個位元組的位址。所以,也就意味著了我們可以使用指標來操作。 malloc()可以用來傳回陣列指標、結構指標等等,所以我們需要把傳回值的型別指派為適當的型別。當malloc()找不到所需的空間時,它將傳回空指標。

範例:

推薦學習:c語言影片教學

double *p;
p=(double*)malloc(30*sizeof(double));
登入後複製

在這個程式中,首先開闢了30個double類型的空間,然後把p指向這個空間的位置。這裡的指標是指向第一個double值。並不是我們全部開闢的30個double的空間。這就和陣列一樣,指向陣列的指標式指向陣列首元素的位址,並不是整個陣列的元素。所以,在這裡我們的運算也跟陣列是一樣的,

p[0]就是第一個元素,p[1]就是第二個元素。

至此,我們就可以掌握到一種宣告動態陣列的方法。

int arr[n];
p=(int *)malloc(n*sizeof(int));
//我们在这里使用的时候要元素个数乘类型字节长度,这样就达到了动态开辟内存空间。
登入後複製

當我們使用malloc()開啟記憶體空間以後,我們所要考慮的就是釋放記憶體空間,在這裡,C給我們提供了free()函數。 free()的參數就是malloc()函數傳回的位址,釋放先前malloc()函數所開啟的空間。

例:

對於上面我們所開闢的空間進行釋放,那麼我們就可以這樣

free(p);
登入後複製

程式也呼叫了exit()函數,這個函數是在記憶體分配失敗時結束程式。

程式範例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>//malloc()函数被包含在malloc.h里面
#include<stdlib.h>
int main(void)
{
    char*a = NULL;//声明一个指向a的char*类型的指针
    a = (char*)malloc(100 * sizeof(char));//使用malloc分配内存的首地址,然后赋值给a
    if (!a)//如果malloc失败,可以得到一些log
    {
        perror("malloc");
        return-1;
    }
    sprintf(a, "%s", "HelloWorld\n");//"HelloWorld\n"写入a指向的地址
    printf("%s\n", a);//输出用户输入的数据
    free(a);//释放掉使用的内存地址
    system("pause");
    return 0;//例2有无内存泄露?
}
登入後複製

這個程式主要用來偵測malloc回傳值條件有誤。

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

使用動態數組,主要是為了獲得程式的靈活性。我們可以需要多少個元素就讓陣列開闢多少個。不需要浪費空間。

更多程式設計入門教程,請追蹤PHP中文網!

以上是c語言怎麼實現動態記憶體分配的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!