Cómo declarar un conjunto de cadenas de tamaño desconocido para obtenerlo del usuario sin usar la función de asignación en C

Restringiré mi respuesta a ISO / ANSI C (dependiendo de su sistema operativo, su compilador, , pueden surgir otras posibilidades).

En C89, debe pasar por mecanismos de asignación dinámica ( malloc , calloc , etc. ).

A partir de C99, puede usar matrices de longitud de matriz variable (VLA). Por ejemplo:

#include
#include
#include
#include

vacío
display_alphabet_chars_until (size_t sz)
{
afirmar (sz <= SCHAR_MAX);
char str [sz + 1];
for (char c = ‘a’; c <sz; ++ c)
str [c] = c;
str [sz] = ‘\ 0’;
pone (str);
}

En t
principal (nulo)
{
display_alphabet_chars_until (10);
display_alphabet_chars_until (20);
display_alphabet_chars_until (26);
display_alphabet_chars_until (60);
devuelve 0;
}

Lo único que debe recordar es que debe tener un valor válido para proporcionar al compilador para que pueda calcular correctamente la longitud de la matriz en tiempo de ejecución.

Tenga en cuenta que C ++ no admite VLA (pero puede usar Array para obtener algo equivalente en C ++ 11).

EDITAR : como mencionó Fayyaz K. Lodhi, los VLA todavía se basan en un esquema de asignación algo dinámico. Sin embargo, la mayoría de los compiladores usan alloca para almacenar estos objetos (generalmente pequeños) en la pila del proceso en tiempo de ejecución. Como resultado, hay poca sobrecarga; de hecho, es bastante similar a asignar n variables que definiría dentro de una función, solo que más rápido, ya que generalmente solo significa mover el puntero de la pila por n * sizeof(type of the array) bytes .

Lo sentimos, el tamaño desconocido significa que cambiaría su longitud dinámicamente, por lo que no puede hacerlo sin la asignación dinámica de memoria.

Por supuesto, puede leer char por char o tener un búfer temporal de tamaño fijo, en el que ingresa tantos caracteres de una sola vez y sigue asignando más memoria para ponerlos. Pero eso es lo más lejos que se puede llegar.

Una idea descabellada (y de aspecto patético) sería leer por char y crear una lista de enlaces (creando miembros de la lista en la pila y asignándole punteros.

Puede funcionar, pero seguro que no se verá como una solución razonable desde ningún punto de vista.

En la práctica, siempre tiene un límite superior, o se reasigna dinámicamente. período