0Pricing
C Academy · Lección

Asignar un array

Reserve memoria en el heap

Asignar un array es una lección gratuita de C Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.

¿Por qué utilizar arrays dinámicos?

Un array normal tiene un tamaño fijo establecido en tiempo de compilación. Sin embargo, a menudo no sabe cuántos elementos necesitará hasta que se ejecuta el programa.

Los arrays dinámicos resuelven este problema: solicite al sistema operativo un bloque de memoria en tiempo de ejecución mediante malloc y determine el tamaño con una variable.

Conozca malloc

malloc (asignación de memoria) se encuentra en <stdlib.h>. Debe pasarle un número de bytes y devuelve un puntero a ese bloque o NULL si se produce un error.

La memoria procede del heap y permanece disponible hasta que la libere.

int *p = malloc(10 * sizeof(int));

Calcular el tamaño con sizeof

No codifique nunca cantidades de bytes fijas. Utilice sizeof para que el código siga siendo correcto en distintas plataformas.

Para reservar espacio para n enteros, multiplique n por sizeof(int). Un modismo habitual es n * sizeof(*p), que utiliza el propio tipo del puntero.

int *p = malloc(n * sizeof(*p));

Compruebe siempre si es NULL

Si el sistema se queda sin memoria, malloc devuelve NULL. Desreferenciar un puntero NULL provoca que el programa se bloquee.

Compruebe el resultado antes de utilizarlo. Este sencillo hábito evita muchos errores difíciles de depurar.

int *p = malloc(n * sizeof(*p));
if (p == NULL) {
    fprintf(stderr, "out of memory\n");
    return 1;
}

Una asignación completa

A continuación se muestra un programa completo que reserva espacio para 5 enteros, los rellena y los imprime.

Observe la simetría: malloc al principio y free al final.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 5;
    int *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) a[i] = i * i;
    for (int i = 0; i < n; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

malloc no inicializa a cero

La memoria obtenida mediante malloc no está inicializada: contiene cualquier dato residual que hubiera allí anteriormente.

Leerla antes de escribir en ella produce valores impredecibles. Asigne siempre un valor a cada elemento antes de leerlo.

int *a = malloc(3 * sizeof(*a));
/* a[0], a[1], a[2] hold garbage here */
a[0] = 10;

calloc inicializa a cero

calloc(count, size) reserva espacio para count elementos de size bytes y establece cada byte en cero.

Utilícela cuando quiera un array limpio y lleno de ceros. Además, protege frente al desbordamiento en la multiplicación.

int *a = calloc(5, sizeof(*a));
/* every element is now 0 */

calloc en acción

Este programa utiliza calloc y confirma que el array comienza lleno de ceros antes de modificarlo.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 4;
    int *a = calloc(n, sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

Indexar el bloque

Un puntero a un bloque del heap se comporta igual que el nombre de un array. Puede utilizar a[i] para leer y escribir cualquier elemento desde 0 hasta n-1.

Internamente, a[i] equivale a *(a + i).

int *a = malloc(3 * sizeof(*a));
a[0] = 1;
*(a + 1) = 2;   /* same as a[1] = 2 */
a[2] = 3;

Vigile los límites

Si reserva n elementos, los índices válidos van de 0 a n-1. Escribir en a[n] constituye un comportamiento indefinido.

C no comprueba los límites por usted, por lo que un error de uno por exceso puede corromper la memoria silenciosamente.

int *a = malloc(3 * sizeof(*a));
a[2] = 99;   /* OK, last valid index */
/* a[3] = 0;  BUG: out of bounds */

Leer el tamaño en tiempo de ejecución

Ahí reside la verdadera potencia: el tamaño puede proceder de una entrada, un archivo o un cálculo. El mismo código puede reservar espacio para 2 o para 2 millones de elementos.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 6;            /* could be scanf'd */
    long *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    long sum = 0;
    for (int i = 0; i < n; i++) { a[i] = i + 1; sum += a[i]; }
    printf("%ld\n", sum);
    free(a);
    return 0;
}

Comprobación rápida

Compruebe su comprensión de la asignación de memoria.

Resumen

Puede reservar un array dinámico con malloc(n * sizeof(*p)) o uno inicializado a cero con calloc(n, sizeof(*p)).

Compruebe siempre si es NULL, recuerde que malloc deja datos residuales, utilice índices del 0 al n-1 y acompañe cada asignación con un free. A continuación, aprenderá a cambiar el tamaño de un bloque conservando sus datos.

Preguntas frecuentes

¿La lección «Asignar un array» es gratis?

Sí — el texto completo de «Asignar un array» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Asignar un array»?

Reserve memoria en el heap Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C Academy?

No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Asignar un array»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C Academy?

Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Asignar un array
  2. Aumentar con realloc
  3. Un tipo de vector reutilizable
  4. Liberar memoria y evitar fugas
← Volver a C Academy