Allocare dinamicamente un array in C
-
Usa la funzione
malloc
per allocare dinamicamente un array in C -
Usa la funzione
realloc
per modificare la regione di memoria già allocata in C - Usa macro per implementare l’allocazione per array di oggetti dati in C
Questo articolo illustrerà più metodi su come allocare dinamicamente un array in C.
Usa la funzione malloc
per allocare dinamicamente un array in C
La funzione malloc
è la funzione principale per l’allocazione della memoria dinamica sull’heap. Alloca il numero di byte specificato e restituisce il puntatore alla regione di memoria. Pertanto, se si desidera allocare dinamicamente un array di determinati tipi di oggetto, è necessario prima dichiarare un puntatore al tipo. Successivamente, malloc
dovrebbe essere chiamato passando il numero di elementi moltiplicato per la dimensione del singolo oggetto come argomento.
Nell’esempio seguente, allochiamo la memoria per memorizzare una stringa di caratteri. errno
è impostato a 0 come richiesto dallo standard di codifica sicura, e il puntatore restituito dalla chiamata malloc
viene controllato per verificare la corretta esecuzione della funzione. Infine, la funzione memmove
viene utilizzata per copiare la stringa nella posizione di memoria allocata.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
const char *str = "random string to be moved";
int main() {
char *arr = NULL;
errno = 0;
arr = malloc(SIZE * sizeof(char));
if (!arr) {
perror("malloc");
exit(EXIT_FAILURE);
}
memmove(arr, str, strlen(str));
printf("arr: %s\n", arr);
free(arr);
exit(EXIT_SUCCESS);
}
Produzione:
arr: random string to be moved
Usa la funzione realloc
per modificare la regione di memoria già allocata in C
La funzione realloc
è usata per modificare la dimensione della regione di memoria precedentemente allocata dalla chiamata malloc
. Accetta l’indirizzo di memoria originale e la nuova dimensione come secondo argomento. Notare che realloc
può restituire lo stesso puntatore passato o uno diverso in base alla dimensione richiesta e alla memoria disponibile dopo l’indirizzo dato. Nel frattempo, il contenuto dell’array precedente rimarrà invariato fino a una nuova dimensione specificata.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
const char *str = "random string to be moved";
int main() {
char *arr = NULL;
errno = 0;
arr = malloc(SIZE);
if (!arr) {
perror("malloc");
exit(EXIT_FAILURE);
}
int num = 102; // User Provided Value
for (int i = 0; i < num; ++i) {
if (i > SIZE) {
arr = realloc(arr, 2 * SIZE);
if (!arr) {
perror("realloc");
exit(EXIT_FAILURE);
}
}
arr[i] = 'a';
}
free(arr);
exit(EXIT_SUCCESS);
}
Usa macro per implementare l’allocazione per array di oggetti dati in C
Di solito, malloc
viene utilizzato per allocare un array di alcune strutture definite dall’utente. Poiché malloc
restituisce il puntatore void
e può essere cast implicitamente a qualsiasi altro tipo, una pratica migliore è lanciare esplicitamente il puntatore restituito al tipo corrispondente. Poiché è relativamente facile perdere le cose e non includere la notazione corretta, abbiamo implementato un’espressione macro che prende il numero di elementi nell’array e il tipo di oggetto per costruire automaticamente l’istruzione malloc
corretta, incluso il cast corretto.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
typedef enum {
Jan,
Feb,
MAR,
APR,
MAY,
JUN,
JUL,
AUG,
SEP,
OCT,
NOV,
DEC
} month;
typedef struct {
unsigned char dd;
month mm;
unsigned yy;
} date;
#define MALLOC_ARRAY(number, type) ((type *)malloc((number) * sizeof(type)))
int main() {
date *d = NULL;
errno = 0;
d = MALLOC_ARRAY(SIZE, date);
if (!d) {
perror("malloc");
exit(EXIT_FAILURE);
}
free(d);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook