Asignar dinámicamente un array en C
-
Utilice la función
malloc
para asignar un array dinámicamente en C -
Utilice la función
realloc
para modificar la región de memoria ya asignada en C - Use macro para implementar la asignación de un Array de objetos dados 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);
}
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