2014-01-09 2 views
1

내 생각에 블록의 자동 변수는 외부 범위로 점프 한 후에 할당 취소됩니다. 그 다음 나는 이것을 시험하기위한 프로그램을 썼다. 그리고 놀랍게도, 그것은 ok로 달렸다. 심지어 여러 번 실행되었습니다.블록 내부의 자동 변수 메모리에 액세스하십시오.

이 프로그램은 다음과 같습니다

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    int *a = 0; 

    { 
     int b = 2; 
     a = &b; 
    } 

    printf("%d\n", *a); 
    return 0; 
} 

인쇄 결과는 2, 어떻게 이런 일이 무엇입니까?

+1

메모리가 아직 남아 있습니다. 다음 함수 호출 또는 블록 범위에 의해 메모리가 막힐 것입니다. 힙 할당 블록을 free'ing 후 메모리에서 읽기 좋아. 작동하는 것은 믿을 수 없지만 때때로 작동합니다. – woolstar

+1

간단합니다. 운이 좋았습니다. 메모리는 "무료"로 표시되지만 누군가 다른 사람이 요청하지 않으면 메모리가 필요하지 않기 때문에 "해제"되지 않습니다. –

+1

남자가 살고있는 것처럼 바닥을 깔아도 컴퓨터를 제공합니다. 심지어 사람이 이사를 했는데도 여전히 집에 컴퓨터가 있습니다. – Rugal

답변

2

ANSI 표준에 따라 블록의 바깥쪽에있는 자동 변수 'b'의 참조는 유효하지 않습니다. 그것은 컴파일러에 의존하며, 어떻게 스택 프레임에 로컬 변수를 push하고 pop하는지에 달려 있습니다. 아마 가장 바깥 쪽 블록에서 나올 때 컴파일러가 모든 지역을 터뜨릴 것입니다.

주소가 스택에 없더라도 읽을 수 있습니다. 이 주소는 스택이 더 커지면 다른 변수에 의해 수정 될 수 있습니다. 이 경우 동일한 데이터를 다시 읽을 수 없습니다.

+0

제 컴파일러는 gcc 4.4.7입니다. 컴파일러가 내부 변수를 끝낸 후에 자동 변수를 팝하면 이전 자동 변수가 새로운 자동 변수에 의해 무시된다는 뜻입니까? 예를 들어 블록 뒤에 문을 추가하면 : int c = 3, 그러면 다음과 같이 인쇄됩니다. 3 이외의 2? – ray5

+0

예.하지만 가장 바깥 쪽 블록에서 나올 때 모든 로컬 변수를 팝하는 경우 일 수 있습니다. 당신은 작은 프로그램을 작성하여 어떻게 로컬 변수를 푸시하고 터뜨리는 지 알 수 있습니까? – iGRJ

0

자동 변수의 범위는 다음 범주로 분류 할 수있다

  1. 글로벌 범위가 선언 된 위치에 따라
  2. 기능 범위
  3. 블록 범위

, 그것은 할 수 있습니다 다른 "가시성".

코드에서 변수 "b"는 범위 내에서만 볼 수 있습니다. 메모리를 할당 할 수 있으며 해당 범위 내에서 사용할 수 있습니다. 바깥쪽에있을 때, 그 메모리는 더 이상 변수 "b"와 관련이 없습니다.

그러나 그렇다고해서 해제되지는 않습니다. 다른 변수 나 블록을 선언하면 동일한 메모리 위치를 사용할 수 있습니다.

인쇄물을 조금 추가하고 참조 할 메모리를 확인할 수 있습니다. 그것은 당신에게 더 나은 이해를 줄 것입니다.

1

모두 컴파일러 구현 방법에 따라 다릅니다. 표준에 따라 로컬 데이터 형식을 사용할 수 없습니다.

관련 문제