2017-01-24 1 views
0

으로 지역 변수를 반환 내가 다음 코드가 : p는 동안 지역 * P는 난을, 그리고 내가 전역에 살고 있기 때문에 괜찮습니다 FUNC는 참조

 int& func(int i){ 
      int *p = &i; 
      return *p; 
     } 

     int& func2(int i){ 
      vector<int> v; 
      v.push_back(i); 
      return v[0]; 
     } 

     int & func3(int i){ 
      array<int,4> arr; 
      arr[0] = i; 
      return arr[0]; 
     } 

     int& func4(int i){ 
      int j = i; 
      return j; 
     } 

    int main(){ 

     cout<<func(3)<<endl; 
     cout<<func2(10)<<endl; 
     cout<<func3(100)<<endl; 
     cout<<func4(123)<<endl; 

    return 0; 
    } 

outuput: 
3 
0 
100 
segmentation faul(core dumped) 

호출 (?). func2를 호출하면 0이 반환됩니다. 어떤 것이 나에게 이해가되지 않습니다. 왜냐하면 v가 로컬 벡터이므로 세그먼트 화 오류가 발생할 것으로 예상됩니다 ... func3을 호출하면 올바른 값이 반환되고 이는 동일한 의미를 갖지 않습니다 이유. func4를 호출하면 마침내 segmentatioun 오류가 발생합니다.

누군가가 나를 어떻게 이해할 수 있습니까? 왜 벡터와 배열은 정적으로 선언 되었기 때문에 작동합니까? 사실 모든 함수가 참조를 반환한다는 것을 고려할 때 벡터와 배열은 로컬 객체이므로 세그먼트 화 오류가 예상되며 함수가 끝나면 삭제해야합니다.

매우 감사합니다.

+5

* 표시하는 코드의 함수 중 아무 것도 * 실제로 작동하지 않습니다 (심지어 func도 아닙니다), 모두 * 정의되지 않은 동작으로 연결됩니다 *. 그리고 일단 정의되지 않은 행동을하면 * 논쟁에 실제로 사용되지 않습니다. –

+0

저는 글로벌 범위에 살고 있습니다. (?) _ 그 아이디어를 당신에게 줬습니까? 모든 예제에서'i'는 함수에 국한된 변수입니다. –

+0

출력이 우연히 func에 전달 된 값과 일치하기 때문에 나는 가정하고 있었다. –

답변

5

정의되지 않은 동작이 발생합니다. 로컬 매개 변수 또는 변수를 참조로 반환하는 것은 주소를 반환하는 것과 같은 방식으로 정의되지 않은 동작입니다.

+0

감사합니다,이 시점에서 내 질문은 : 로컬 개체에 대한 참조/포인터를 반환하는 것이 맞습니까? –

1

당신이 원하는 또는 참조를 반환해야하는 경우, 다음 정적 변수 사용

int& my_func(int variable) 
{ 
    static int some_value = 0; 
    some_value = variable; 
    return some_value; 
} 

키워드 static가 실행이 기능을 잎 후 변수가 수명을해야합니다 컴파일러를 지시합니다.

참조를 반환하려면 은 실행 후 함수가 사라지지 않는 변수로을 참조해야합니다.

+0

고마워, 그럼 내 질문은, 내가 로컬 참조/포인터를 전역 개체에 바인딩 반환 할 수 있습니까? –

+0

예, 글로벌 및 파일 로컬 변수에 대한 참조를 반환 할 수 있습니다. –

관련 문제