Saltar al contenido

Declarar matrices en lenguaje c sin tamaño inicial

Solución:

En C, las matrices y los punteros están estrechamente relacionados. De hecho, por diseño, una matriz es solo una convención de sintaxis para acceder a un puntero a una memoria asignada. * (consulte la nota para obtener más detalles a continuación)

Entonces en C la declaración

 anyarray[n] 

es lo mismo que

 *(anyarray+n)

Usando aritmética de punteros.

Realmente no tiene que preocuparse por los detalles para que “funcione” ya que está diseñado para ser algo intuitivo.

Simplemente cree un puntero, asigne la memoria y luego acceda a ella como una matriz.

Aquí hay algunos ejemplos:

int *temp = null; // this will be our array


// allocate space for 10 items
temp = malloc(sizeof(int)*10);


// reference the first element of temp
temp[0] = 70;


// free the memory when done
free(temp);

Recuerde: si accede fuera del área asignada, tendrá efectos desconocidos.

  • Para que quede claro, es el operador de indexación ([ ]) que se traduce a aritmética de punteros. Esta no es una matriz en el sentido moderno del tipo. Si (o no) el puntero involucrado apunta a la memoria asignada (dinámicamente) es intrascendente para cómo funciona este operador. En un lenguaje más moderno, podría operar en la matriz como un tipo abstracto (para ver qué tan grande es, por ejemplo), no puede hacer esto en C.

Una matriz sin un tamaño inicial es básicamente una puntero. Para establecer dinámicamente el tamaño de la matriz, debe usar el malloc() o calloc() funciones. Estos asignarán una cantidad específica de bytes de memoria.

En su código anterior, declare temp como int puntero

int *temp;

Luego asigne espacio para ello usando malloc() o calloc(). El argumento que toman estas funciones es el número de bytes de memoria para asignar. En este caso, desea suficiente espacio para d ints. Entonces…

temp = malloc(d * sizeof(int));

malloc devuelve un puntero al primer byte del bloque de memoria que se acaba de asignar. Las matrices regulares son simplemente punteros al primer byte en un bloque de memoria seccionado, que es exactamente lo que temp es ahora. Por lo tanto, puede tratar el temp puntero como una matriz! Al igual que:

temp[1] = 10;
int foo = temp[1];
printf("%d", foo);

Salidas

10

Necesitarás declarar temp como un int puntero (en lugar de un int formación). Entonces, puedes usar malloc en tus main (después de tu primera scanf):

temp = malloc(d * sizeof(int));
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *