Una tabla que crece
Una fila de punteros, y cada uno apuntando a su propia fila.
1Por qué
Un tablero, una matriz, una imagen: todo eso son tablas con filas y columnas. Y todo eso aparece en los talleres del semestre.
En C, una tabla de tamaño decidido al vuelo se arma en dos pisos. Primero pides una fila de punteros, uno por cada fila de la tabla. Después, a cada uno de esos punteros le pides su propia fila de datos.
Por eso el tipo lleva dos estrellas: int **t. La primera dice «puntero a», la segunda «puntero a un entero». Junto: un puntero a punteros a enteros.
Una vez armada se usa con dos corchetes, t[1][2], y se lee como cualquiera esperaría: fila 1, columna 2. La complicación está en construirla, no en usarla.
Aquí aparece calloc, que es como malloc pero además deja todo en cero. Para una tabla es lo que quieres: empezar con basura en un tablero es pedir problemas.
Y al devolver hay que hacerlo al revés: primero cada fila, y la fila de punteros al final. Si devuelves la de punteros primero, te quedas sin saber dónde estaban las otras — y ya no hay forma de recuperarlas.
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 filas = 2;int cols = 3;int **t = calloc(filas, sizeof(int *));for (int i = 0; i < filas; i++)t[i] = calloc(cols, sizeof(int));t[1][2] = 9;printf("%d\n", t[1][2]);for (int i = 0; i < filas; i++)free(t[i]);free(t);return 0;}
- línea 9
El primer piso: una fila de punteros, uno por cada fila de la tabla. Fíjate en elsizeof(int *)— son punteros, no enteros. - línea 11
El segundo piso: a cada puntero se le da su propia fila de enteros. - línea 13
Ya armada, se usa como cualquiera esperaría. Los dos corchetes son dos saltos: primero a la fila, después a la columna. - línea 18
Se devuelve al revés: primero cada fila. Si soltarastantes, ya no sabrías dónde están.
3Ahora tú
Arma una tabla de 3 filas por 2 columnas, pon un 4 en la última casilla y escríbelo
#include <stdio.h>#include <stdlib.h>int main(void){int filas = 3;int cols = 2;int **t = calloc(filas, sizeof(int *));for (int i = 0; i < filas; i++)t[2][1] = 4;printf("%d\n", t[2][1]);for (int i = 0; i < filas; i++)free(t[i]);free(t);return 0;}
↖︎ Tu línea va aquí: es el segundo piso, la fila propia de cada puntero.
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