(五)學習筆記 c語言基礎 動態內存分配

1.使用標準庫函數在C程序中動態分配內存:malloc(),calloc(),free()和realloc()

數組是單個類型的固定數量值的集合。在使用之前,需要先聲明數組的大小。然而有時聲明的數組大小可能不足,要解決此問題,可以在運行時手動分配內存(即動態內存分配)。
在<stdlib.h>庫下,有四個函數:malloc(),calloc(),realloc()和free()

1) malloc()代表內存分配

該malloc()函數保留指定字符數的內存塊。並且返回一個類型的指針void,可以將其轉換爲任何形式的指針。
語法:
int *ptr = (cast-type *) malloc(byte-size);
例子:
int *ptr = (int *) malloc(100 * sizeof(int));
int大小爲4個字節,此語句分配400個字節的內存。並且,指針ptr保存分配的存儲器中的第一個字節的地址。如果空間不足,分配將失敗並返回NULL指針。

2)calloc()代表連續分配

malloc()函數分配單個內存塊,calloc()分配多個內存塊並將它們初始化爲零。
語法:
int *ptr = (cast-type *)calloc(n, element-size);
例子:
int *ptr = (float *) calloc(25, sizeof(float));
在內存中爲25個元素分配連續空間,每個元素大小爲4個字節。

3)free()釋放內存中分配的空間

語法:
free(ptr);

示例1:malloc()和free(),計算用戶輸入的n個數字的總和。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, *ptr, sum = 0;
    printf("輸入的元素總個數:");
    scanf("%d", &n);

    ptr = (int *)malloc(n * sizeof(int));
    //或者使用calloc()申請內存
    //ptr = (int *)malloc(n, sizeof(int));
    
    if (ptr == NULL)
    {
        printf("申請內存出錯了!");
        exit(0);
    }

    printf("輸入元素:");
    for (i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }

    printf("輸入元素的和是:%d\n", sum);
    free(ptr);
    return 0;
}
4) realloc()函數

如果動態分配的內存不足,可以通過realloc()函數更改先前分配的內存大小
語句:
int ptr = realloc(ptr, x)

示例2 realloc()
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *ptr, i, n1, n2;
    printf("輸入數組大小:\n");
    scanf("%d", &n1);

    ptr = (int *)malloc(n1 * sizeof(int));

    printf("已經分配的內存地址:");
    for (i = 0; i < n1; ++i)
        printf("%p \n", ptr + i);

    printf("\n輸入新的數組大小:");
    scanf("%d", &n2);
    ptr = realloc(ptr, n2 * sizeof(int));

    printf("新分配的內存地址:");
    for (i = 0; i < n2; ++i)
        printf("%p \n", ptr + i);

    return 0;
}

翻譯自
c動態內存分配

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章