Allocare dinamicamente un array in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione malloc per allocare dinamicamente un array in C
  2. Usa la funzione realloc per modificare la regione di memoria già allocata in C
  3. Usa macro per implementare l’allocazione per array di oggetti dati in C
Allocare dinamicamente un array 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);
}
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Articolo correlato - C Array