¿Puedes definir el tamaño de una matriz en tiempo de ejecución en C?

Nuevo en C, muchas gracias por la ayuda.

¿Es posible definir una matriz en C sin especificar su tamaño o inicializarlo?

Por ejemplo, ¿puedo pedirle a un usuario que ingrese números y los almacene en una matriz int? No sabré cuántos números ingresarán de antemano.

La única forma en que puedo pensar ahora es definir un tamaño máximo, que no es una solución ideal …

Bueno, puedes asignar dinámicamente el tamaño:

#include  int main(int argc, char *argv[]) { int *array; int cnt; int i; /* In the real world, you should do a lot more error checking than this */ printf("enter the amount\n"); scanf("%d", &cnt); array = malloc(cnt * sizeof(int)); /* do stuff with it */ for(i=0; i < cnt; i++) array[i] = 10*i; for(i=0; i < cnt; i++) printf("array[%d] = %d\n", i, array[i]); free(array); return 0; } 

Quizás algo como esto:

 #include  #include  /* An arbitrary starting size. Should be close to what you expect to use, but not really that important */ #define INIT_ARRAY_SIZE 8 int array_size = INIT_ARRAY_SIZE; int array_index = 0; array = malloc(array_size * sizeof(int)); void array_push(int value) { array[array_index] = value; array_index++; if(array_index >= array_size) { array_size *= 2; array = realloc(array, array_size * sizeof(int)); } } int main(int argc, char *argv[]) { int shouldBreak = 0; int val; while (!shouldBreak) { scanf("%d", &val); shouldBreak = (val == 0); array_push(val); } } 

Esto solicitará los números y los almacenará en una matriz, como usted lo solicitó. Terminará cuando se pase dado un 0.

Usted crea una función de array_push para agregar a su matriz, llama a realloc con esta función cuando se queda sin espacio. Duplica la cantidad de espacio asignado cada vez. A lo sumo, asignará el doble de la memoria que necesita, en el peor de los casos, llamará ” realloc log n”, donde n es el tamaño final de la matriz.

También es posible que desee comprobar si hay algún error después de llamar a malloc y realloc. No he hecho esto arriba.

Las matrices, por definición, son estructuras de memoria de tamaño fijo. Quieres un vector. Ya que el Estándar C no define los vectores, puedes intentar buscar una biblioteca, o hacer rodar los tuyos manualmente.

Debe realizar una asignación dinámica: desea un puntero a una dirección de memoria de tamaño aún desconocido. Lea sobre malloc y realloc .

Si todo lo que necesita es una estructura de datos en la que pueda cambiar su tamaño de forma dinámica, entonces la mejor opción que puede elegir es una lista vinculada. Puede agregar datos a la lista asignándoles memoria dinámicamente, ¡y esto sería mucho más fácil!

Si, absolutamente. C99 introdujo el VLA o la matriz de longitud variable. Un código simple sería como tal:

 #include  int main (void) { int arraysize; printf("How bid do you want your array to be?\n"); scanf("%d",&arraysize); int ar[arraysize]; return 0; } 

Puede usar malloc para asignar memoria dinámicamente (es decir, el tamaño no se conoce hasta el tiempo de ejecución).

C es un lenguaje de bajo nivel: debe liberar manualmente la memoria después de usarla; Si no lo hace, su progtwig sufrirá de pérdidas de memoria.

ACTUALIZAR

Solo lee tu comentario en otra respuesta.

Estás pidiendo una matriz con un tamaño que cambia dinámicamente.

Bueno, C no tiene medios de lenguaje / sintácticos para hacer eso; debe implementar esto usted mismo o usar una biblioteca que ya lo haya implementado.

Vea esta pregunta: ¿Existe una implementación de matriz de matriz automática / matriz dinámica para C que viene con glibc?

Para algo como esto, es posible que desee ver estructuras de datos como: Listas enlazadas (Ideal para esta situación) Varios árboles (árboles binarios, montones, etc.) Pilas y colas

Pero en cuanto a la instanciación de una matriz de tamaño variable, esto no es realmente posible.

Lo más cercano a una matriz dinámica es usar malloc y sus comandos asociados (delete, realloc, etc.).

Pero en esta situación, el uso de comandos como malloc puede resultar en la necesidad de expandir la matriz, una operación costosa en la que se inicializa otra matriz y luego se copia la matriz antigua en esa. Las listas, y otros tipos de datos, son generalmente mucho mejores para cambiar el tamaño.

Si está buscando instalaciones de matriz y no quiere rodar las suyas, pruebe lo siguiente:

  1. Fácil
  2. Apache APR
  3. NSPR

Si eres un principiante, tal vez no quieras lidiar con malloc y free aún. Entonces, si está utilizando GCC, puede asignar matrices de tamaño variable en la stack, simplemente especificando el tamaño como una expresión.

Por ejemplo:

 #include  void dyn_array(const unsigned int n) { int array[n]; int i; for(i=0; i 

Pero tenga en cuenta que esta no es una extensión estándar, por lo que no debe contar con ella si la portabilidad es importante.

Las respuestas anteriores son correctas, pero hay una corrección, la función malloc () reserva un bloque de memoria de tamaño específico y devuelve un puntero de tipo void * que se puede convertir en un puntero de cualquier forma. Sintaxis: ptr = (cast-type *) malloc (byte-size)

 #include #include int main(int argc,char* argv[]){ int *arraySize,length; scanf("%d",&length); arraySize = (int*)malloc(length*sizeof(int)); for(int i=0;i