¿Hay alguna forma (aparte de malloc
) para crear una matriz con un tamaño que el usuario ingrese?¿Hay alguna manera de crear una matriz con una longitud variable en c?
Respuesta
Una forma es usar un VLA (C99 define lo que se denomina 'Arrays de longitud variable').
Aquí se muestra un ejemplo:
#include <stdio.h>
int use_a_vla (int n)
{
int vla[n]; /* Array length is derived from function argument. */
vla[0] = 10;
vla[n-1] = 10;
return 0;
}
int main (void)
{
int i;
scanf ("%d", &i); /* User input. */
use_a_vla (i);
}
Todo depende del compilador.
de longitud variable arrays automáticos están permitidos en
ISO C99
, y como una extensión GCC los acepta en el modo de C90 y en C++. Estas matrices se declaran como cualquier otra matriz automática, pero con una longitud que no es una expresión constante. El almacenamiento se asigna en el punto de la declaración y se desasigna cuando se cierra el nivel de llave. Por ejemplo :
FILE *
concat_fopen (char *s1, char *s2, char *mode)
{
char str[strlen (s1) + strlen (s2) + 1];
strcpy (str, s1);
strcat (str, s2);
return fopen (str, mode);
}
Ver this para más información.
Bueno, esto es pedante, pero puede escribir su propio código de gestión de montón y llamar a su función de asignación de memoria algo distinto de malloc(). Espero que esta respuesta sea divertida en lugar de molesta.
Si usted no tiene VLA o alloca()
, aquí es una, técnica extremadamente kludgy, pero portátil basado en la pila:
int foo(int size)
{
if (size <= 64*1024)
{
unsigned char arr[64*1024];
return bar(arr, size);
}
else if (size <= 1*1024*1024)
{
unsigned char arr[1*1024*1024];
return bar(arr, size);
}
else if (size <= 64*1024*1024)
{
unsigned char arr[64*1024*1024];
return bar(arr, size);
}
else
return -1; // Assume it's too big
}
int bar(unsigned char arr[], int size)
{
...your code goes here...
}
int maincode(int size)
{
// Invoke bar() indirectly, allocating an array
// on the stack of at least 'size' bytes
return foo(size);
}
Yo particularmente no recomiendo esta técnica, pero se le dará de manera diferente bloques de memoria de tamaño grande asignados en la pila en lugar del montón.
Supongo que está intentando evitar malloc
porque no sabe acerca de realloc
.
Básicamente, deberías tratar de hacer más o menos lo que hace el vector C++. Una vez que su matriz crece a un cierto tamaño, realloc
al doble de su tamaño.
realloc
hará crecer su bloque de memoria si es posible, y si no es posible malloc
uno nuevo y copiará el contenido.
- 1. En PyTables, ¿cómo crear una matriz anidada de longitud variable?
- 2. Matriz de una longitud desconocida en C#
- 3. ¿Hay alguna manera de alias/anclar una matriz en YAML?
- 4. ¿Hay alguna manera de inicializar una matriz con variables no constantes? (C++)
- 5. ¿Hay alguna manera de ver cuánta memoria usa una variable?
- 6. ¿Hay alguna manera de probar una variable para "isForEachable"
- 7. Objetos de longitud variable: ¿Alguna vez una buena idea?
- 8. ¿Hay alguna manera de revertir una cripta() en c?
- 9. C++: ¿Hay alguna manera de definir una matriz estática en línea?
- 10. ¿Hay alguna manera de crear una cola en una burbuja con HTML 5?
- 11. ¿Hay alguna manera de hacer una función atómica en C? .
- 12. ¿Sobrecarga de la matriz de longitud variable en C++?
- 13. ¿Hay alguna manera de desactivar una etiqueta?
- 14. ¿Hay alguna manera de inicializar estáticamente una matriz asignada dinámicamente en C++?
- 15. Iteración a través de una matriz Java de longitud variable
- 16. ¿Hay alguna manera de definir una lista <> de dos elementos de matriz de cadenas?
- 17. ¿Hay alguna manera de volcar una C struct?
- 18. Cómo aumentar la longitud de una matriz
- 19. ¿Hay alguna manera de especificar una expresión lambda C# "vacía"?
- 20. C# crear una matriz de controles
- 21. ¿Hay alguna manera de verificar si una variable es una fecha en JavaScript?
- 22. ¿Hay alguna manera de pausar una CABasicAnimation?
- 23. ¿Hay alguna manera de verificar si una variable es un número entero? C++
- 24. ¿Hay alguna manera de "limpiar" una superficie?
- 25. ¿Hay alguna manera de crear complementos de Eclipse con Python?
- 26. ¿Cómo puedo crear una matriz de longitud dinámica bidimensional?
- 27. ¿Hay alguna manera de obtener el tamaño de una variable de PHP en bytes?
- 28. ¿Hay una mejor manera de transponer una matriz PHP 2D?
- 29. ¿Hay una función estándar en C que devuelva la longitud de una matriz?
- 30. ¿Hay alguna manera de usar ConcurrentDictionary.TryUpdate con una expresión lambda?
Necesita un compilador que lo admita y las opciones correctas habilitadas. Pero tenga en cuenta los inconvenientes de los VLA antes de hacerlo. – Mysticial
¿Por qué no quieres usar 'malloc()'? –
Quiero saber si hay alguna manera alternativa de hacerlo. – rippy