2014-04-17 2 views
-1

:스택 정수에 대한 포인터 값 (NULL이됩니까?)? 다음 코드 조각을 감안할 때

#include <iostream> 
using namespace std; 
int *pPointer; 

int func() 
{ 
    int num; 
    num = 25; 
    pPointer = &num; 
} 

int main() 
{ 
    func(); 
    cout << *pPointer << endl; 
    cout << *pPointer << endl; 
    return 0; 
} 

내가 다음 줄을 복제하는 경우 사람이 말해 줄 수 : 내가받을 이유

cout << *pPointer << endl; 
cout << *pPointer << endl; 

25 (예상대로)하지만 다음 값이 0 (NULL)?

int = 25 값이 스택에 남아 있지 않습니까? pPointer의 가치를 변화시키는 cout에 대해서는 무엇입니까? 범위와 스택에 대한 나의 이해에 대해 뭔가 빠졌는가? (나는 자바 녀석이다. 그래서 이것은 놀랍다).

+1

코드에 정의되지 않은 동작이 있습니다. 'func()'는'int'를 리턴해야합니다. 그리고'func()'가 빠져 나간 후 포인터를 역 참조하는 것도 정의되지 않았다. – Praetorian

+2

@GSerg의 링크에있는 설명이 가장 좋은 대답입니다. – jliv902

+0

감사합니다 * 모두 * 대답으로 모두 표시해 주시기 바랍니다. 범위와 정의되지 않은 동작으로 무언가를해야한다는 것을 알았지 만 명확히 해 주셔서 감사합니다. 코드! – gcraig

답변

2

pPointer이 로컬 변수 func()을 가리키고 있기 때문입니다. 이 메모리 영역은 func() 메소드 내부에서만 유효합니다. func() 종료 후 pPointer이 가리키는 메모리는 다시 사용할 수 있으며 cout에 의해 사용 된 것 같습니다. 이 메모리를 유지하려면

, 당신은 값으로 저장하거나 동적으로 여기 pPointer = new int(num)

2

num 기능이 없으면 func()이 종료됩니다.

주소가있는 경우 해당 주소를 가져온 다음 더 이상 유효하지 않은 주소로 값을 인쇄하십시오.

아무거나 발생할 수 있습니다.

+0

아. 그래서 내가 deoutferenced 포인터를 통해 num을 계산할 때, 나는 25 개를 가지고있다. 그러나 func()가 이미 종료 되었기 때문에, cout의 다음 호출은 정의되지 않은 포인터를 출력한다. 또는 컴파일러의 구현에 따라 null? 당신의 통찰력에 감사드립니다. – gcraig

+0

첫 번째와 두 번째 시간 모두 더 이상 유효하지 않은 주소에 액세스합니다. 두 값 모두 다른 값을 갖는 이유는 누구나 추측 할 수 있습니다 ('printf() '에 대한 라이브러리 코드가 그 값을 결정 짓는 것 같습니다). – pmg

1

정의되지 않은 동작이므로 func 범위 외부에 num이 없습니다.

1
cout << *pPointer << endl; 

*pPointer 이미 반환 된 다른 함수의 지역 변수를 가리키는 메모리를 할당해야 하나 주소가 범위를 벗어나므로 동작은 undefined입니다. num에 할당 된 올바른 값이 인쇄되거나 인쇄되지 않을 수 있습니다.

0

예상 한대로 25 개를 받았지만 다음 값이 0 (NULL) 인 이유는 무엇입니까?

예상대로 언급 한 내용은 실제로 예상되지 않습니다!

numfunc()이 반환되는 즉시 범위를 벗어납니다. pPointer이 유효하지만 (글로벌이므로) *pPointer은 범위를 벗어난 메모리를 가리키기 때문에 유효하지 않습니다.