Alocar dinamicamente un array em C

Jinku Hu 12 outubro 2023
  1. Use a função malloc para alocar um array dinamicamente em C
  2. Use a função realloc para modificar a região de memória já alocada em C
  3. Use macro para implementar alocação para matriz de objetos fornecidos em C
Alocar dinamicamente un array em C

Este artigo demonstrará vários métodos de como alocar un array dinamicamente em C.

Use a função malloc para alocar um array dinamicamente em C

A função malloc é a função central para alocar a memória dinâmica no heap. Ele aloca o número determinado de bytes e retorna o ponteiro para a região da memória. Portanto, se alguém deseja alocar um array de certos tipos de objetos dinamicamente, um ponteiro para o tipo deve ser declarado primeiro. Em seguida, malloc deve ser chamado passando o número de elementos multiplicado pelo tamanho do único objeto como um argumento.

No exemplo a seguir, alocamos a memória para armazenar uma string de caracteres. errno é definido como 0 conforme exigido pelo padrão de codificação seguro, e o ponteiro retornado da chamada malloc é verificado para verificar a execução bem-sucedida da função. Finalmente, a função memmove é utilizada para copiar a string para o local de memória alocado.

#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);
}

Resultado:

arr: random string to be moved

Use a função realloc para modificar a região de memória já alocada em C

A função realloc é usada para modificar o tamanho da região da memória previamente alocado pela chamada malloc. Leva o endereço de memória original e o novo tamanho como o segundo argumento. Observe que realloc pode retornar o mesmo ponteiro que foi passado ou um diferente com base no tamanho solicitado e na memória disponível após o endereço fornecido. Enquanto isso, o conteúdo do array anterior permanecerá inalterado até um tamanho recém-especificado.

#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);
}

Use macro para implementar alocação para matriz de objetos fornecidos em C

Normalmente, malloc é usado para alocar um array de algumas estruturas definidas pelo usuário. Como o malloc retorna o ponteiro void e pode ser convertido implicitamente em qualquer outro tipo, uma prática melhor é converter o ponteiro retornado explicitamente no tipo correspondente. Como é relativamente fácil perder coisas e não incluir a notação adequada, implementamos uma expressão macro que pega o número de elementos no array e o tipo de objeto para construir automaticamente a instrução malloc correta, incluindo o lista adequado.

#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);
}
Autor: 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

Artigo relacionado - C Array