2009-04-10 9 views
47

He estado usando C++ durante algunos años, y hoy vi algunos códigos, pero ¿cómo puede ser esto perfectamente legal?¿Se permite el tamaño de la matriz en tiempo de ejecución sin asignación dinámica?

int main(int argc, char **argv) 
{ 
    size_t size; 
    cin >> size; 
    int array[size]; 
    for(size_t i = 0; i < size; i++) 
    { 
     array[i] = i; 
     cout << i << endl; 
    } 

    return 0; 
} 

Compiled under GCC.

¿Cómo se puede determinar el tamaño en tiempo de ejecución sin new o malloc?

Solo para verificarlo de nuevo, he buscado en Google algunos y todos los códigos similares a los míos afirman dar error de tamaño de almacenamiento.

Even Deitel's C++ Cómo Programar p. 261 estados en Error de programación común 4.5:

Solo se pueden usar constantes para declarar el tamaño de matrices automáticas y estáticas.

Enlight me.

+2

nota de que DMA significa "acceso directo a memoria" - Creo que usted está planteando asignación dinámica –

+2

C o C++? Elegir uno_. –

+1

Nuevamente, elija uno: C o C++. Esta pregunta es explícita y solo acerca de C; no debería haber una etiqueta C++. –

Respuesta

49

Esto es válido en C99.

El estándar C99 admite matrices de tamaño variable en la pila. Probablemente su compilador también haya elegido apoyar esta construcción.

Tenga en cuenta que esto es diferente de malloc y new. gcc asigna la matriz en la pila, al igual que lo hace con int array[100] simplemente ajustando el puntero de la pila. No se realiza la asignación de montón. Es más o menos como _alloca.

+7

Me encontré con este mismo escenario en un archivo en nuestra base de código que fue escrito hace meses.Estaba desconcertado, al igual que el resto del equipo, sobre por qué compilaba. En nuestra situación, el tamaño de la matriz se calculó antes de declarar la matriz también (¿y tampoco debería permitirse?) De todos modos, se produjo un desafío. Cualquiera que pueda responder por qué esto es legal recibe una tarta popular. Si alguna vez estás en Seattle, házmelo saber. Tengo una tarta popular para ti. –

+0

¿Puede proporcionar alguna información/enlace sobre cómo funciona la pila internamente en este caso? ¿Esto introduce algo de sobrecarga en el tiempo de ejecución? – balki

+1

@balki La sobrecarga es menor, ya que es básicamente incrementar/decrementar el puntero de la pila. El comportamiento de la pila puede ser esencialmente idéntico al caso normal si guarda el puntero de pila original al principio de la función. –

4

Es válido C99, no es válido C++. Esta es una de las pocas diferencias entre los dos idiomas.

+2

Supongo que se admitirá en C++ 0x –

+0

No según la sección 8.3.4 del borrador del estándar. –

+2

nunca se incluirá en C++ 1x: D pero esperemos que llegue Dynarray . Me encantaría. entonces podrías hacer Dynarray a (some_size); y hacer que se asigne eficientemente, posiblemente con compilador hax como _alloca, etc. –

18

Esto se conoce como VLA (arrays de longitud variable). Es estándar en c99, pero gcc lo permite en código C++ como una extensión. Si desea que rechace el código, intente experimentar con las opciones -std=standard, -ansi y -pedantic.

0

Puedes dar tamaño a una matriz dinámicamente si utilizas el compilador Dev-Cpp Lo probé y no obtuve ningún error, pero en compiladores visuales de C++ y visual studio no es posible. Creo que la razón es que dev-C++ asigna un número positivo al int sin inicializar y cuando le damos un número se lo reemplaza por el dado. pero quizás otros compiladores den nulo a variables no inicializadas.

+0

La mayoría de los compiladores no asignan nada a las variables locales sin inicializar; por lo general, parecen contener lo que estaba en la memoria que ocupan hasta que el programa las asigna. Parece que el Dev-C++ al que se hace referencia es un IDE sobre MinGW, que incluye un puerto de GCC como compilador. Como se señala en otras respuestas, los VLA no son C++ estándar, pero algunos compiladores (incluido g ++) los admiten de todos modos. – jerry

+0

Dev-C++ no es un compilador. Tampoco es Visual Studio. Dev-C++ usa GCC/G ++ como su compilador, mientras que Visual Studio usa cl (componente de compilación de Microsoft). Por sí mismos, Dev-C++ y Visual Studio son Entornos de Desarrollo Integrado (IDE). Esta es una distinción importante que hacer. Dev-C++ no "asigna" nada. El compilador hace eso. – Elkvis

-1

Las matrices de longitud variable (VLA) son compatibles con el estándar C++ 14, que se aceptó recientemente y está en espera de publicación.

+1

Los VLA aún no son parte del estándar. Hay un [dynarray] (http://en.cppreference.com/w/cpp/container/dynarray) TS, pero aún no está ratificado. – Jason

0

Este código se ejecuta en el compilador GNU GCC.

#include<bits/stdc++.h> 

int main(int argc, char **argv) 

{ 
    size_t size; 

    std:: cin >> size; 

    int array[size]; 

    for(size_t i = 0; i < size; i++) 

{ 

array[i] = i; 

     std:: cout << i; 

} 

    return 0; 
} 
Cuestiones relacionadas