Esto se puede hacer mediante el uso de un puntero, y la asignación de memoria en el montón usando malloc
. Tenga en cuenta que no hay forma de preguntar más tarde qué tan grande es ese bloque de memoria. Debe hacer un seguimiento del tamaño de la matriz usted mismo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv)
{
/* declare a pointer do an integer */
int *data;
/* we also have to keep track of how big our array is - I use 50 as an example*/
const int datacount = 50;
data = malloc(sizeof(int) * datacount); /* allocate memory for 50 int's */
if (!data) { /* If data == 0 after the call to malloc, allocation failed for some reason */
perror("Error allocating memory");
abort();
}
/* at this point, we know that data points to a valid block of memory.
Remember, however, that this memory is not initialized in any way -- it contains garbage.
Let's start by clearing it. */
memset(data, 0, sizeof(int)*datacount);
/* now our array contains all zeroes. */
data[0] = 1;
data[2] = 15;
data[49] = 66; /* the last element in our array, since we start counting from 0 */
/* Loop through the array, printing out the values (mostly zeroes, but even so) */
for(int i = 0; i < datacount; ++i) {
printf("Element %d: %d\n", i, data[i]);
}
}
Eso es todo. Lo que sigue es una explicación más complicada de por qué funciona esto :)
No sé qué tan bien conoce los punteros C, pero el acceso a la matriz en C (como array[2]
) es en realidad una abreviatura para acceder a la memoria mediante un puntero. Para acceder a la memoria apuntada por data
, escriba *data
. Esto se conoce como desreferenciación del puntero. Desde data
es de tipo int *
, entonces *data
es de tipo int
. Ahora a una información importante: (data + 2)
significa "agregar el tamaño de bytes de 2 entradas a la dirección apuntada por data
".
una matriz en C es sólo una secuencia de valores en la memoria adyacente. array[1]
está justo al lado de array[0]
. Entonces, cuando asignamos un gran bloque de memoria y queremos usarlo como una matriz, necesitamos una manera fácil de obtener la dirección directa de cada elemento dentro. Afortunadamente, C nos permite usar la notación de matriz en los punteros también. data[0]
significa lo mismo que *(data+0)
, a saber, "acceder a la memoria apuntada por data
". data[2]
significa *(data+2)
, y accede al tercero int
en el bloque de memoria.
¿Qué tal 'malloc'? Las matrices no son punteros, y los punteros no son matrices. Pero se puede acceder cómodamente a los punteros como matrices y una matriz sin guiones se evalúa como un puntero al primer elemento. –
@pst: ¿Has leído la pregunta? "Sé que podría hacerse utilizando malloc, pero aún no sé cómo usarlo". –
indiqué señor que soy consciente de ello, pero no sé cómo usarlo, sin embargo, que explica cómo sería la mejor respuesta para mí: D – arscariosus