English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial di base del linguaggio C

Controllo di flusso del linguaggio C

C语言函数

C语言数组

C语言指针

C语言字符串

Struttura del linguaggio C

File del linguaggio C

C altri

Manuale di riferimento del linguaggio C

C动态分配内存

In questo tutorial, imparerai a utilizzare le funzioni della libreria standard malloc(), calloc(), free() e realloc() per allocare memoria dinamicamente nei programmi in linguaggio C.

Come noto, un array è un insieme di valori di numero fisso. Dopo aver dichiarato la dimensione dell'array, non è possibile modificarla.

A volte, la dimensione dell'array dichiarato potrebbe non essere sufficiente. Per risolvere questo problema, è possibile allocare manualmente la memoria in esecuzione. Questo in linguaggio C è noto come allocazione di memoria dinamica.

È possibile utilizzare le funzioni della libreria standard malloc(), calloc(), realloc() e free() per allocare memoria dinamicamente. Queste funzioni sono definite nel file di intestazione <stdlib.h>.

C malloc()

Il nome "malloc" indica l'allocazione di memoria.

La funzione malloc() riserva un blocco di memoria di byte specificati. E restituisce un voidPuntatorepuò essere convertito in qualsiasi tipo di puntatore.

Sintassi di malloc()

ptr = (castType*) malloc(size);

Esempio

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

La seguente istruzione assegna 400 byte di memoria. Poiché la dimensione di un numero floating point è di 4 byte. E il puntatore ptr memorizza l'indirizzo del primo byte dell'allocazione di memoria.

Se non è possibile allocare memoria, l'espressione genererà un puntatore NULL.

C calloc()

Il nome "calloc" indica l'allocazione contigua.

La funzione malloc() assegna memoria e mantiene i bit non inizializzati. Mentre la funzione calloc() assegna memoria e inizializza tutti i bit a zero.

Sintassi di calloc()

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

Esempio:

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

La seguente istruzione assegna uno spazio contiguo in memoria per 25 elementi di tipo float.

C free()

La memoria allocata dinamicamente con calloc() o malloc() non viene liberata automaticamente. È necessario liberare esplicitamente lo spazio utilizzando free().

Sintassi di free()

free(ptr);

Questa istruzione libera lo spazio allocato nella memoria puntata da ptr.

Esempio 1: malloc() e free()

//Programma per calcolare la somma dei numeri inseriti dall'utente
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, *ptr, sum = 0;
    printf("Inserisci il numero di elementi: \n");
    scanf("%d", &n);
    ptr = (int*)malloc(n * sizeof(int));
 
    //Se non è possibile allocare memoria
    if(ptr == NULL)                     
    {
        printf("Errore! Memoria non allocata.\n");
        exit(0);
    }
    printf("Inserisci l'elemento: \n");
    for(i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }
    printf("Somma = %d", sum);
  
    //Liberazione della memoria
    free(ptr);
    return 0;
}

In questo caso, abbiamo allocato memoria dinamica per n int.

Esempio 2: calloc() e free()

//Programma per calcolare la somma dei numeri inseriti dall'utente
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, *ptr, sum = 0;
    printf("Inserisci il numero di elementi: \n");
    scanf("%d", &n);
    ptr = (int*)calloc(n, sizeof(int));
    if(ptr == NULL)
    {
        printf("Errore! Memoria non allocata.\n");
        exit(0);
    }
    printf("Inserisci l'elemento: \n");
    for(i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }
    printf("Somma = %d", sum);
    free(ptr);
    return 0;
}

C realloc()

Se la memoria dinamica allocata è insufficiente o supera la dimensione necessaria, è possibile utilizzare la funzione realloc() per cambiare la dimensione della memoria allocata in precedenza.

Sintassi di realloc()

ptr = realloc(ptr, x);

In questo caso, ptr viene riassegnato alla nuova dimensione x.

Esempio 3: realloc()

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *ptr, i, n1, n2;
    printf("Inserisci la dimensione: \n");
    scanf("%d", &n1);
    ptr = (int*)malloc(n1 * sizeof(int));
    printf("Indirizzo della memoria allocata in precedenza: \n");
    for (i = 0; i < n1; ++i)
        printf("睵n", ptr + i);
    printf("\nInserisci la nuova dimensione: \n");
    scanf("%d", &n2);
    //Riassegnazione della memoria
    ptr = realloc(ptr, n2 * sizeof(int));
    printf("Nuova memoria allocata: \n");
    for (i = 0; i < n2; ++i)
        printf("睵n", ptr + i);
    free(ptr);
    return 0;
}

运行该程序时,输出为:

输入大小: 3
先前分配的内存地址: 7452312
7452316
7452320
输入新的大小: 5
新分配的内存地址: 7452312
7452316
7452320
7452324
7452328