Alocar dinamicamente un array em C

  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

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 <stdlib.h>
#include <stdio.h>
#include <errno.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 <stdlib.h>
#include <stdio.h>
#include <errno.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 <stdlib.h>
#include <stdio.h>
#include <errno.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);
}

Artigo relacionado - C Array

  • Clear Char Array em C