2010-12-27 20 views

Respuesta

24

No hay garantía.

Una vez que v sale del alcance, hacer cualquier cosa con él (incluso a través de un puntero) se considera Undefined Behavior.

Como con cualquier otro comportamiento indefinido, simplemente porque funciona en un sistema operativo, compilador, versión del compilador, hora del día, etc., no significa que funcionará para otro.

+3

En este caso particular, también puede notar diferencias en el comportamiento según la configuración de optimización del compilador. De nuevo, nada es inamovible, porque el estándar C no define lo que se supone que sucederá aquí. –

8

Para añadir en la respuesta de Merlyn, un caso en que esto probablemente como resultado un comportamiento que no tenía la intención es la siguiente:

#include <stdio.h> 
int main(){ 
    int *p; 
    { 
     int v = 1; 
     p = &v; 
    } 
    { 
     int w = 2; 
     printf("%d\n", w); 
    } 
    printf("%d\n", *p); 
    return 0; 
} 

El compilador puede optimizar esto por tener v y w comparten la misma asignación de la pila. Nuevamente, el compilador también podría no optimizar esto, es por eso que no se define el comportamiento del uso de punteros a las variables después de su final de bloque envolvente. El programa puede generar "2" y "1", o "2" y "2", o "2" y algo completamente diferente según el compilador y la configuración que se utilicen.

+3

Su último párrafo es incorrecto. Según C99 §6.8.5.3, "Si la cláusula-1 es una declaración , el alcance de cualquier identificador que declare es el resto de la declaración y todo el ciclo, incluidas las otras dos expresiones" Es * no * en alcance para el resto de main. –

+1

@Matthew: ¿Estás seguro de que se refiere a la duración y no solo al alcance léxico? – cdhowie

+1

Creo que son ambas cosas. La nota al pie dice: "Por lo tanto, la cláusula-1 especifica la inicialización para el ciclo, posiblemente declarando una o más variables ** para su uso en el ciclo **" (énfasis añadido). El estándar de C++ (§6.5.3) lo explica más claramente (pero creo de manera equivalente), mostrando cómo se crea un bloque simulado. –

0

ya que funcionará a veces, pero uno no puede estar seguro de que funciona ... A veces no sólo produce un error autobús, pero incluso puede causar toda la caída del programa ...

yo dará un ejemplo

echar un vistazo a esto .. http://www.functionx.com/cpp/examples/returnreference.htm

aquí él está tratando de devolver la referencia de una variable que se sale del ámbito ... (gran error) ..pero que funciona ....

no se puede garantizar ... Por lo tanto, es mejor (nunca mejor) nunca devolver la referencia a datos que van fuera del alcance

Cuestiones relacionadas