2015-01-20 3 views
3

전역 범위의 함수에서 정의 된 정적 변수를 방문하여 수정하려고하지만 출력의 두 번째 및 세 번째 줄이 예기치 않은 이유는 무엇입니까?정의 된 함수 외부에서 로컬 정적 포인터 변수 조작

#include <iostream> 

using namespace std; 

int * foo(){ 
    static int *x = new int(5); 
    cout << *x << '\t' << &x << endl; 
    *x++; 
    return x; 
} 

int main(){ 
    int * ox; 
    ox = foo(); 
    cout << *ox << '\t' << &ox << endl; 
    *ox++; 
    cout << *ox << '\t' << &ox << endl; 
    int * t= foo(); 
} 

출력은 (내 컴퓨터에서)입니다 :

5 0x6021d0 
0 0x7fffdc82d3a0 
0 0x7fffdc82d3a0 
0 0x6021d0 

모든 의견을 환영합니다.

답변

3

일부 구문 분석 문제로 인해 잡혔습니다. 의 코드에 라인 별을 보자는 :

처음 제어 흐름이 라인을 통과
static int * x = new int(5); 

x 새로 값을 각각 다음 시간 제어 흐름이 통과 5로 초기화 int 할당에 대한 포인터를 할당 by, 라인은 건너 뜁니다. 지금까지 놀랄 일이 없습니다. 난 당신이 값이 아닌 포인터의 주소를 인쇄하는 것을 의미 한 의심

cout << *x << '\t' << &x << endl; 

는, 따라서 흥미가됩니다 이제

cout << *x << '\t' << x << endl; 

를 입력했습니다. 이 줄은 아마도 당신이 생각하는대로하지 않을 것입니다.

*x++; 

컴파일러는 *(x++)으로 구문 분석합니다. 무슨 일이 일어나고 포인터 x 고급이며 이전 값 dereferenced 및 그 결과를 버리게됩니다. (이제는 x이 할당 된 메모리 위치를 지나치므로 다음에 함수가 입력 될 때 정의되지 않은 동작을 호출합니다.) x가 가리키는 값을 증가시키는 (*x)++으로 구문 분석 된 것으로 가정했을 것입니다.

동일한 패턴이 main에 적용됩니다.

main.cpp: In function ‘int* foo()’: 
main.cpp:8:7: warning: value computed is not used [-Wunused-value] 
    *x++; 
    ^

main.cpp: In function ‘int main()’: 
main.cpp:16:8: warning: value computed is not used [-Wunused-value] 
    *ox++; 
     ^
+1

@ 5gin12eder 아니요,'* x ++'는 역 참조 할 때 접미사 연산자에서 임시를 사용합니다. 이미 증가 된 포인터를 역 참조하지 않습니다. 사실, 그것은'* (x ++)'로 해석되지만'(x ++)'의 결과는 "old"'x'와 임시로 동일합니다. – vsoftco

+0

@vsoftco 아, 맞아. 그것을 간과했다. 정의되지 않은 동작은 포인터가 다음에 참조 해제 될 때 발생합니다. – 5gon12eder

+0

'& x'을 발견했습니다. –

4

작동 순서. 두 번, 당신은 *ox++;을 수행합니다.

이것은 (*ox)++ "뾰족한-에 가치를 증가"로 평가되지.

*(ox++)"포인터를 증가 시키십시오"입니다.

왜 ox가 0입니까?

ox은 우연히 0을 가리키고 있습니다. 자신이 소유하지 않은 메모리를 가리 키도록 증가 시켰습니다.

+0

감사합니다 : 나는 GCC와 원래의 코드를 컴파일하고 (항상 좋은 생각)을 -Wall 플래그를 전달하면

, 그것은 우리에게 무슨 일이 일어나고 있는지에 좋은 힌트를 제공합니다! 나는 너무 부주의하다.) – Myzh

+0

@ Myyh 당신을 환영한다! 5gon12eder의 답변도보십시오. 내가하기 전에 그들은 "포인터의 주소"를 인쇄하고 있습니다. +1.:) –