Hoy encontré un código que me confundió. Hizo algo como esto:
#include <stdio.h> int main(int argc, char **argv) { int x = 5; int foo[x]; foo[0] = 33; printf("%d\n", foo[0]); return 0; }Mi pregunta es ¿por qué funciona esto?
La matriz foo está en la pila, entonces, ¿cómo podría expandirse por x ?
Yo hubiera esperado algo como esto:
#include <stdio.h> int main(int argc, char **argv) { int x = 5; int foo[] = malloc(sizeof(int)*x); foo[0] = 33; printf("%d\n", foo[0]); free(foo); return 0; }No es que sea más bonito o algo así, pero me pregunto.
el fragmento
int foo[x]; está hablando de la ventaja de algo llamado función VLA ( matriz de longitud variable ). Se introdujo en el estándar C99 , solo para convertirse en una función opcional en el C11 .
De esta manera, podemos crear una estructura de datos de matriz, cuya longitud se proporciona (proporciona) en tiempo de ejecución.
Tenga en cuenta que, aunque se crea en tiempo de ejecución, gcc asigna los VLA en la memoria de la pila (a diferencia de la asignación de memoria dinámica de la memoria del montón).
La matriz foo está en la pila, entonces, ¿cómo podría expandirse por x?
gcc simplemente mueve el puntero de la pila:
subq %rax, %rsp