Pedir sitio a la medida
Cuando no sabes cuántas cajitas necesitas hasta que el programa corre.
1Por qué
Todos los arreglos que has escrito tienen su tamaño puesto a mano: int notas[4]. Ese 4 se decide cuando escribes el programa, y no se puede cambiar después.
Eso funciona mientras sepas el número de antemano. Pero casi nunca lo sabes. ¿Cuántas notas tiene el curso? ¿Cuántas palabras trae el archivo? Eso se sabe cuando el programa ya está corriendo, no antes.
Para eso existe malloc: pedirle al sistema un sitio del tamaño que digas, en el momento. Le pasas cuántos bytes quieres y te devuelve la dirección del primero — un puntero, como los de la misión anterior.
sizeof(int) dice cuántos bytes ocupa un entero, así que malloc(cuantos * sizeof(int)) pide sitio justo para esa cantidad. Nunca escribas el número de bytes a mano: en otra máquina un int puede ocupar otra cosa, y sizeof siempre acierta.
Desde ahí, el puntero se usa con corchetes igual que un arreglo normal. Eso ya lo sabes: v[2] y *(v + 2) son lo mismo.
2Míralo andar
Este programa funciona. Léelo, y después ejecútalo sin cambiar nada.
#include <stdio.h>#include <stdlib.h>int main(void){int cuantos = 3;int *v = malloc(cuantos * sizeof(int));for (int i = 0; i < cuantos; i++)v[i] = i * 10;printf("%d\n", v[2]);free(v);return 0;}
- línea 2
mallocyfreeno vienen destdio.hsino destdlib.h. Sin esta línea no existirían. - línea 7
Pide sitio para 3 enteros y devuelve la dirección del primero.ves un puntero, no un arreglo — aunque se use igual. - línea 10
Corchetes sobre un puntero: exactamente lo mismo que sobre un arreglo. - línea 14
Lo que se pide hay que devolverlo. De esto va la lección siguiente.
3Ahora tú
Pide sitio para 5 enteros, guarda en cada uno su posición multiplicada por sí misma, y escribe el último: 16
#include <stdio.h>#include <stdlib.h>int main(void){int cuantos = 5;int *v =for (int i = 0; i < cuantos; i++)v[i] = i * i;printf("%d\n", v[4]);free(v);return 0;}
Ejecutar
Lo que dice tu programa
↖︎ Escribe tu parte y dale a Ejecutar
Qué pasó
Aquí te aviso si tu programa hace algo raro.
4Qué guarda tu programa
Memoria
↖︎ Ejecuta el programa para ver qué pasa por dentro