memoria - ¿Arrays dinámicos en C sin malloc?
malloc en c (4)
Siempre me he preguntado cómo podría salirme con la suya:
int main(int argc, char **argv) {
printf("%p %s %d/n", &argv[1], argv[1], strlen(argv[1]));
char copy[strlen(argv[1]) + 1];
strcpy(copy, argv[1]);
printf("%p %s %d/n", ©, copy, strlen(copy));
return 0;
}
La copy
matriz de caracteres se asigna de todos modos y el programa funciona bien, imprimiendo el original y la copia. Y Valgrind no se queja de nada.
Pensé que los arreglos dinámicos no eran posibles en C sin malloc. ¿Estaba equivocado?
Esta es una característica de C99 y podría ser implementada en versiones anteriores por el compilador .
Los arreglos automáticos de longitud variable están permitidos en ISO C99, y como una extensión, GCC los acepta en modo 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 sale del nivel de refuerzo.
Incluso antes de la existencia de "arreglos de longitud variable", cortesía de gcc y C99, había:
alloca()
- que permite la asignación dinámica de memoria de pila ("automática").
Los arreglos de longitud variable se originaron como una extensión GCC , pero también fueron adoptados por C99 .
Todavía están siendo asignados en la pila, por lo que hacerlos "enormes" se considera un mal estilo (y es probable que se rompa en ti algún día).
Se agregaron "matrices de longitud variable" al lenguaje C en C99. Esto se trata en §6.7.5.2 "Declaradores de matrices":
Si el tamaño es una expresión que no es una expresión constante de entero: si aparece en una declaración en el prototipo de función, se trata como si fuera reemplazada por *; de lo contrario, cada vez que se evalúe tendrá un valor mayor que cero. El tamaño de cada instancia de un tipo de matriz de longitud variable no cambia durante su vida útil. Cuando una expresión de tamaño es parte del operando de un operador sizeof y cambiar el valor de la expresión de tamaño no afectaría el resultado del operador, no se especifica si la expresión de tamaño se evalúa o no.