2010-09-28 9 views
5

Estoy estudiando para mi prueba en C y estoy leyendo en un resumen en C que descargué de algún sitio. Está escrito que no está permitido escribir arr[i] donde i es una variable. La única forma de hacerlo es con malloc.
Sin embargo, me escribió el siguiente código y compila sin advertencias y sin error en valgrind:Declaración de una matriz con una variable de tamaño no constante

int index = 5; 
int a4[index]; 

a4[0] = 1; 
a4[1] = 2; 

int index2; 
scanf("%d",&index2); 
int a5[index2]; 
a5[0] = 1; 
a5[1] = 2; 

Entonces, ¿qué es la verdad detrás de las declaraciones de matrices? ¡gracias!

+0

Como advertencia: recomendaría no confiar demasiado en los resúmenes de C encontrados en Internet; Recientemente, pasé mucho tiempo revisando C y C++ en preparación para las entrevistas, y encontré que la mayoría de las "guías de estudio" de Internet tenían información inexacta o engañosa. Yo recomendaría [un buen libro introductorio] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list), con la advertencia de que a menudo tales libros no cubren C99 características porque se implementan menos comúnmente. –

+1

Si bien son legales en C99, los VLA son * extremadamente * peligrosos a menos que ya tenga un límite muy pequeño en el valor de la expresión que se utilizará como tamaño de matriz. Pueden conducir fácilmente al desbordamiento de la pila (no del tipo bueno :-) y a la destrucción de la memoria del montón. –

Respuesta

14

C99 permite crear variable length arrays en la pila. Tu compilador puede admitir esta característica. Esta característica no está disponible en C89.

Lo que el resumen le dijo que era cierto, desde cierto punto de vista. :-)

+0

La matriz de longitud variable me hace sentir confundido al principio porque recuerdo que no es compatible cuando solía aprender C con VC6.0. Justo ahora me parece que se usa en el código de ejemplo de InsertionSort en Hackerrank.com. Ahora está claro. Hackerrank adopta gcc4.7.3, modo C99, por lo que esta función es totalmente compatible. – ChandlerQ

Cuestiones relacionadas