C 語言基礎(chǔ)教程

C 語言流程控制

C 語言函數(shù)

C 語言數(shù)組

C 語言指針

C 語言字符串

C 語言結(jié)構(gòu)體

C 語言文件

C 其他

C 語言參考手冊

C 動(dòng)態(tài)分配內(nèi)存

在本教程中,您將學(xué)習(xí)使用標(biāo)準(zhǔn)庫函數(shù):malloc(),calloc(),free()和realloc()在C語言程序中動(dòng)態(tài)分配內(nèi)存。

如您所知,數(shù)組是固定數(shù)量的值的集合。聲明數(shù)組的大小后,您將無法更改它。

有時(shí),您聲明的數(shù)組的大小可能不足。要解決此問題,可以在運(yùn)行時(shí)手動(dòng)分配內(nèi)存。這在C語言編程中稱為動(dòng)態(tài)內(nèi)存分配。

可以使用標(biāo)準(zhǔn)庫函數(shù)malloc(),calloc(),realloc()和free(),進(jìn)行動(dòng)態(tài)分配內(nèi)存。這些函數(shù)在<stdlib.h>頭文件中定義。

C malloc()

名稱“ malloc”表示內(nèi)存分配。

malloc()函數(shù)保留一個(gè)指定字節(jié)數(shù)的內(nèi)存塊。 并且,它返回一個(gè)void指針,可以將其轉(zhuǎn)換為任何形式的指針。

malloc()的語法

ptr = (castType*) malloc(size);

示例

ptr = (float*) malloc(100 * sizeof(float));

上面的語句分配了400字節(jié)的內(nèi)存。因?yàn)楦↑c(diǎn)數(shù)的大小是4字節(jié)。并且,指針ptr保存分配內(nèi)存中的第一個(gè)字節(jié)的地址。

如果無法分配內(nèi)存,則表達(dá)式將產(chǎn)生NULL指針。

C calloc()

名稱“ calloc”表示連續(xù)分配。

malloc()函數(shù)分配內(nèi)存,并保留未初始化的內(nèi)存。 而calloc()函數(shù)分配內(nèi)存并將所有位初始化為零。

calloc()的語法

ptr = (castType*)calloc(n, size);

示例:

ptr = (float*) calloc(25, sizeof(float));

上面的語句在內(nèi)存中為25個(gè)float類型的元素分配連續(xù)空間。

C free()

使用calloc()或malloc()動(dòng)態(tài)分配的內(nèi)存不會(huì)自己釋放。必須顯式地使用free()來釋放空間。

free()的語法

free(ptr);

該語句釋放由ptr指向的內(nèi)存中分配的空間。

示例1:malloc()和free()

//程序來計(jì)算用戶輸入的n個(gè)數(shù)字的總和

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, *ptr, sum = 0;

    printf("輸入元素?cái)?shù)量: ");
    scanf("%d", &n);

    ptr = (int*) malloc(n * sizeof(int));
 
    // 如果無法分配內(nèi)存
    if(ptr == NULL)                     
    {
        printf("錯(cuò)誤! 內(nèi)存未分配。");
        exit(0);
    }

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

    printf("Sum = %d", sum);
  
    //釋放內(nèi)存
    free(ptr);

    return 0;
}

在這里,我們?yōu)閚個(gè)int動(dòng)態(tài)分配了內(nèi)存。

示例2:calloc()和free()

//程序來計(jì)算用戶輸入的n個(gè)數(shù)字的總和

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, *ptr, sum = 0;
    printf("輸入元素?cái)?shù)量: ");
    scanf("%d", &n);

    ptr = (int*) calloc(n, sizeof(int));
    if(ptr == NULL)
    {
        printf("錯(cuò)誤! 內(nèi)存未分配。");
        exit(0);
    }

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

    printf("Sum = %d", sum);
    free(ptr);
    return 0;
}

C realloc()

如果動(dòng)態(tài)分配的內(nèi)存不足或超過所需,可以使用realloc()函數(shù)更改以前分配的內(nèi)存的大小。

realloc()的語法

ptr = realloc(ptr, x);

在這里,ptr被重新分配為新的大小x。

示例3:realloc()

#include <stdio.h>
#include <stdlib.h>

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

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

    printf("先前分配的內(nèi)存地址: ");
    for (i = 0; i < n1; ++i)
        printf("%u\n", ptr + i);

    printf("\n輸入新的大小: ");
    scanf("%d", &n2);

    //重新分配內(nèi)存
    ptr = realloc(ptr, n2 * sizeof(int));

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

    free(ptr);

    return 0;
}

運(yùn)行該程序時(shí),輸出為:

輸入大小: 3
先前分配的內(nèi)存地址: 7452312
7452316
7452320

輸入新的大小: 5
新分配的內(nèi)存地址: 7452312
7452316
7452320
7452324
7452328
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清