亚洲区国产区激情区无码区,国产成人mv视频在线观看,国产A毛片AAAAAA,亚洲精品国产首次亮相在线

C 語言基礎教程

C 語言流程控制

C 語言函數(shù)

C 語言數(shù)組

C 語言指針

C 語言字符串

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

C 語言文件

C 其他

C 語言參考手冊

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

在本教程中,您將學習使用標準庫函數(shù):malloc(),calloc(),free()和realloc()在C語言程序中動態(tài)分配內(nèi)存。

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

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

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

C malloc()

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

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

malloc()的語法

ptr = (castType*) malloc(size);

示例

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

上面的語句分配了400字節(jié)的內(nèi)存。因為浮點數(shù)的大小是4字節(jié)。并且,指針ptr保存分配內(nèi)存中的第一個字節(jié)的地址。

如果無法分配內(nèi)存,則表達式將產(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個float類型的元素分配連續(xù)空間。

C free()

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

free()的語法

free(ptr);

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

示例1:malloc()和free()

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

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

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

    printf("輸入元素數(shù)量: ");
    scanf("%d", &n);

    ptr = (int*) malloc(n * sizeof(int));
 
    // 如果無法分配內(nèi)存
    if(ptr == NULL)                     
    {
        printf("錯誤! 內(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)閚個int動態(tài)分配了內(nèi)存。

示例2:calloc()和free()

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

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

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

    ptr = (int*) calloc(n, sizeof(int));
    if(ptr == NULL)
    {
        printf("錯誤! 內(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()

如果動態(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;
}

運行該程序時,輸出為:

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

輸入新的大小: 5
新分配的內(nèi)存地址: 7452312
7452316
7452320
7452324
7452328