2010-12-27 15 views

Odpowiedz

24

Nie ma żadnej gwarancji.

Po wykryciu poza zasięgiem v robienie czegokolwiek z nim (nawet za pomocą wskaźnika) jest uważane za Undefined Behavior.

Podobnie jak w przypadku każdego innego niezdefiniowanego zachowania, tylko dlatego, że działa na jednym systemie operacyjnym, kompilator, wersja kompilatora, pora dnia, itp., Nie oznacza, że ​​będzie działać dla innego.

+3

W tym szczególnym przypadku można zauważyć różnice w zachowaniu w zależności od ustawień optymalizacji kompilatora. Ponownie, nic nie jest ustawione w kamieniu, ponieważ standard C nie definiuje tego, co ma się wydarzyć tutaj. –

8

Aby dodać na odpowiedź Merlyn, w jednym przypadku będzie to prawdopodobnie prowadzić do zachowań, że nie zamierza się następująco:

#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; 
} 

Kompilator może zoptymalizować poprzez v i w udział ten sam podział na stos. Znowu kompilator może również nie optymalizować tego - dlatego nie jest zdefiniowane zachowanie stosowania wskaźników do zmiennych po zamknięciu ich bloków. Program może wyświetlać "2" i "1" lub "2" i "2" lub "2" i coś zupełnie innego w zależności od tego, który kompilator i ustawienia są używane.

+3

Twój ostatni akapit jest błędny. Zgodnie z C99 §6.8.5.3, "Jeśli klauzula-1 jest deklaracją , zakres wszystkich deklarowanych przez nią identyfikatorów stanowi pozostałą część deklaracji i całej pętli, w tym pozostałe dwa wyrażenia" To nie * jest w zakresie pozostała część głównej. –

+1

@Matthew: Czy jesteś pewien, że odnosi się do życia, a nie tylko zakresu leksykalnego? – cdhowie

+1

Wierzę, że to jedno i drugie. Przypis mówi: "Tak więc, klauzula-1 określa inicjalizację pętli, ewentualnie deklarując jedną lub więcej zmiennych ** do użycia w pętli **" (podkreślenie dodane). Standard C++ (§6.5.3) wyjaśnia to jaśniej (ale sądzę, że w podobny sposób), pokazując w jaki sposób tworzony jest symulowany blok. –

0

ya to będzie działać czasami, ale nie można mieć pewność, że to działa ... To czasem nie tylko powoduje błąd autobusów, ale nawet może spowodować awarię całego programu ...

dam u przykładowe

spojrzeć na to .. http://www.functionx.com/cpp/examples/returnreference.htm

tutaj stara się powrócić odniesienie zmiennej, która wykracza poza zakres ... (Big pomyłka) ..ale to działa ....

Nie można jej zagwarantować. Tak więc lepiej (najlepiej nie najlepiej) nigdy nie zwracać odwołań do danych wykraczających poza zakres

Powiązane problemy