2011-11-14 11 views
10

Hay tal código:matriz de tamaño definido por la variable no constante

#include <iostream> 

int main() 
{ 
    int size; 
    std::cin >> size; 

    size = size + 1; 
    int tab3[size]; 

    tab3[0] = 5; 
    std::cout << tab3[0] << " " << sizeof(tab3) << std::endl; 
    return 0; 
} 

El resultado es:

$ g++ prog.cpp -o prog -Wall -W 
$ ./prog 
5 
5 24 

¿Por qué este código incluso compilar? ¿No debería ser la longitud de la matriz una variable constante?

Utilicé g ++ versión 4.4.5.

Respuesta

13

Las matrices de longitud variable en C++ están disponibles como una extensión en GCC. La compilación con todas las advertencias debería haberlo alertado sobre ese hecho (incluya -pedantic).

+0

+1, aunque no tenía idea de que 'sizeof()' también puede ser no constante. Si alguna vez pensé en usar 'sizeof()' en eso esperaría que fallara por alguna razón. –

+0

@ MichaelKrelin-hacker: de nuevo, como una extensión ... Los VLA requieren un tiempo de ejecución 'sizeof()', por lo que es parte del estándar C99. Simplemente no es un tipo de cosas muy C++. Piensa en 'decltype' y todo esto ... –

+0

Es interesante que no parece existir * ningún * método estandarizado de asignación de memoria en la pila. Podríamos manejar la construcción de objetos con la ubicación-nueva, pero es imposible en C++ obtener una cantidad variable de memoria sin formato en la pila. –

7

Es una característica C99, no una parte de C++. Se refieren normalmente como VLA (matrices de longitud variable

Si ejecuta g++ con -pedantic será rechazada

Ver GCC docs para obtener más información

Ver también:.... VLAs are evil

2

GCC proporciona VLA o matrices de longitud variable. Una mejor práctica es crear un puntero y usar la palabra clave new para asignar espacio. Los VLA no están disponibles en MSVC, por lo que la segunda opción es mejor para el código multiplataforma

Cuestiones relacionadas