Alocar dinamicamente un array em C
-
Use a função
malloc
para alocar um array dinamicamente em C -
Use a função
realloc
para modificar a região de memória já alocada em C - 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 <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);
}
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