¿Se puede determinar el tamaño de la matriz en tiempo de ejecución en c?

Como sé, una matriz debe tener un tamaño específico antes de comstackr el tiempo en c.

Me pregunto por qué este código todavía funciona.

int s; printf("enter the array size: "); scanf("%d",&s); int a[s]; // Isn't s value determined at run time? 

Los tamaños de matriz deben conocerse con ANSI 89 C. La versión 99 de la especificación eliminó esta limitación y permitió matrices de tamaño variable.

Aquí está la documentación, no la versión GNU de esta característica

Si necesita asignar una matriz con tamaño dynamic, debe obtenerla del montón, con malloc ().

 int *a = (int*)malloc(sizeof(int) * s) 

Este código es compatible con la especificación de lenguaje C99. Este código también es compatible con el comstackdor GCC en el modo C89 / 90 como una extensión.

Entonces, la respuesta a su pregunta (por qué “funciona”) depende de cómo la está comstackndo. En general, esto ni siquiera comstackrá un comstackdor C89 / 90.

Estás confundiendo dos cosas aquí.

1) Determinar el tamaño de una matriz ya asignada (que implica el título): divide sizeof() para el total por el tamaño de un elemento (por ejemplo, el primero):

  sizeof(a)/sizeof(a[0]) 

2) Asignación dinámica de memoria a medida que su pregunta lo haga:

  int *a = (int*)malloc( s * sizeof(int) ); 

Es importante comprender cómo un comstackdor asigna la memoria a la variable para dar la respuesta adecuada a su pregunta. Hay dos modos en los que la memoria se asigna a la variable, puede estar en un montón o puede estar en una stack. La memoria en un montón se asigna dinámicamente. Por lo tanto, a una variable que tiene memoria asignada en un montón se le puede dar su tamaño durante el tiempo de ejecución.

Las matrices en el caso de C reciben memoria en una stack. Para proporcionar memoria en una stack, el comstackdor debe conocer el tamaño de la memoria durante el tiempo de comstackción. De modo que durante el tiempo de ejecución, esa cantidad de memoria puede reservarse para la variable en la stack. Esa es la razón por la que no puede decidir el tamaño de la matriz en tiempo de ejecución en lo que respecta al lenguaje C.

Las matrices de longitud variable han sido parte del lenguaje C desde C99 . Pero se han hecho como una característica en C11 , lo que significa que una implementación conforme C11 no necesita proporcionarla (aunque, prácticamente, toda la implementación que admite C99 ciertamente proporciona VLA en C11).

Puede verificar si su implementación no proporciona VLA utilizando la macro __STDC_NO_VLA__ (si está definida en el modo de comstackción C99 o C11, entonces su implementación no admite VLA).

Así que es posible decidir un tamaño de matriz en tiempo de ejecución en C moderna (> = C99) y el código como el siguiente está bien:

 int s; printf("Enter the array size: "); scanf("%d", &s); int a[s]; 

Una desventaja obvia de los VLA es que si s es bastante grande y la asignación de a coud falla. Peor aún, no hay manera de comprobar si la asignación ha fallado y se encontrará con errores de tiempo de ejecución (por ejemplo, segfault). Es un comportamiento esencialmente indefinido . Por lo tanto , debe evitar los VLA si el tamaño de la matriz es demasiado grande . Básicamente, cuando tenga dudas, busque la asignación de memoria dinámica (consulte a continuación).

Otro problema, mucho menos grave en comparación con otros, con los VLA es que tienen una duración de almacenamiento automática (también conocido como “stack asignada”). Entonces, si desea algo que dure más tiempo que el scope del bloque donde se declara el VLA, entonces los VLA no son de ayuda.

En C89 , no hay VLA. Entonces, usar la asignación de memoria dinámica es la única forma. Aunque hubo algunas extensiones no estándar como alloca() que es similar a VLA y tiene los mismos inconvenientes que los VLA).

 int s; printf("enter the array size: "); scanf("%d",&s); int *a = malloc(s * sizeof *a); ... free(a);