Asignar dinámicamente un array en C

Jinku Hu 12 octubre 2023
  1. Utilice la función malloc para asignar un array dinámicamente en C
  2. Utilice la función realloc para modificar la región de memoria ya asignada en C
  3. Use macro para implementar la asignación de un Array de objetos dados en C
Asignar dinámicamente un array en C

Este artículo demostrará varios métodos de cómo asignar un array dinámicamente en C.

Utilice la función malloc para asignar un array dinámicamente en C

La función malloc es la función principal para asignar la memoria dinámica en el montón. Asigna el número dado de bytes y devuelve el puntero a la región de memoria. Por lo tanto, si uno quiere asignar un array de ciertos tipos de objetos de forma dinámica, primero debe declararse un puntero al tipo. A continuación, se debe llamar a malloc pasando el número de elementos multiplicado por el tamaño del objeto individual como argumento.

En el siguiente ejemplo, asignamos la memoria para almacenar una cadena de caracteres. errno se establece en 0 como lo requiere el estándar de codificación segura, y el puntero devuelto por la llamada malloc se verifica para verificar la ejecución exitosa de la función. Finalmente, la función memmove se utiliza para copiar la cadena en la ubicación de memoria asignada.

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

Producción :

arr: random string to be moved

Utilice la función realloc para modificar la región de memoria ya asignada en C

La función realloc se utiliza para modificar el tamaño de la región de memoria previamente asignada por la llamada malloc. Toma la dirección de memoria original y el nuevo tamaño como segundo argumento. Tenga en cuenta que realloc puede devolver el mismo puntero que se pasó o uno diferente según el tamaño solicitado y la memoria disponible después de la dirección dada. Mientras tanto, el contenido del array anterior no se modificará hasta un tamaño recién 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 la asignación de un Array de objetos dados en C

Normalmente, malloc se utiliza para asignar un array de algunas estructuras definidas por el usuario. Dado que malloc devuelve el puntero void y se puede convertir implícitamente a cualquier otro tipo, una mejor práctica es convertir el puntero devuelto al tipo correspondiente explícitamente. Debido a que es relativamente fácil pasar por alto cosas y no incluir la notación adecuada, implementamos una expresión macro que toma el número de elementos en el array y el tipo de objeto para construir automáticamente la declaración malloc correcta, incluida la conversión adecuada.

#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

Artículo relacionado - C Array