2012-03-20 2 views
7
struct node 
{ 
    Item item; node *l, *r; 
    node(Item x) {item = x; l = 0; r = 0;} 
}; 

typedef node* link; 
link max(Item a[], int l, int r) 
{ 
    int m = (l+r)/2; 
    link x = new node(a[m]); 
    if (l==r) return x; // return a local pointer 
    x->l = max(a, l, m); 
    x-r = max(a, m+1, r); 
    Item u = x->l->item, v = x->r->item; 
    if (u>v) x->item = u; 
    else x->item=v; 

    return x; // return a local pointer 
} 

이것은 Robert Sedgewick, 252 페이지, 프로그램 5.19의 "C++ 알고리즘"코드의 일부입니다. 그리고 함수 max()에서 반환 된 변수는 함수 내에 만들어진 포인터입니다.로컬 포인터를 반환

제 생각에는 로컬 포인터를 반환하는 것은 c/C++에서 허용되지 않습니다. 그래서 제 질문은 "이것과 같은 함수를 작성하는 것이 좋습니다"입니다. 나는 그런 고전적인 책이 이런 실수를 저질렀다는 것을 믿을 수 없다. 아니면 원칙을 오해 했나요? 도와주세요. 감사.

+0

@ link : 새로운 노드 (a [m]);! = 로컬 포인터 – Mysticial

+1

@Mysticial : 말하자면, 로컬 포인터이지만 로컬 객체를 가리 키지 않습니다 :-) –

+0

'c'에서 로컬 변수에 대한 포인터를 경고를 반환하고, 당신이하고있는 것을 알지 못한다면 피해야 만합니다.하지만 작동 할 것입니다. 확실하지 않은'C++ '오류로 변경됩니다. – twain249

답변

5

x은 "로컬 포인터"가 아닙니다. 즉, 로컬 변수에 대한 포인터가 아닙니다. *xnew을 사용하여 할당되었습니다. x 동적으로 할당 된 메모리를 가리키고 포인터를 반환하면됩니다. 그렇습니다.이 함수를 작성하는 것은 괜찮습니다. 책에 오류가 없습니다.

3

로컬 변수에 대한 포인터를 반환하면 오류가 발생합니다. 힙에 할당 변수에 x 포인트 :

link x = new node(a[m]); 

따라서 x 지역 변수를 가리키는되지 않습니다.

로컬 변수에 대한 포인터를 반환하는 것이 오류 인 이유는 함수가 활성화되어있는 동안 (즉, 입력되고 종료 될 때)에만 해당 변수가 존재하기 때문입니다. 힙에 할당 된 변수 (예 : new 연산자 사용)는 할당 해제 될 때까지 존재합니다 (예 : delete 연산자 사용).

+0

그래서 우리가 명시 적으로 그렇게 할 때까지 x에 할당 된 메모리는 해제되지 않습니다. 또는 변수가 범위를 벗어나면 함수 스택에 할당 된 메모리가 정의되지 않는다고 말할 수 있습니까? 하지만 힙은 그렇지 않습니까? –

+0

예. 명시 적 할당 취소가 필요합니다. 또한 힙에 할당 된 변수는 할당 된 함수에서 반환 된 후에도 계속 존재합니다. –

1

x의 내용이 스택이 아닌 힙에 할당 되었기 때문에 이것은 문제없이 완벽합니다. typedef node* link;이 있기 때문에 혼란 스러울 수 있습니다. x이 실제로 node *이라는 사실을 숨기므로 스택 할당처럼 보입니다.

+1

'x'는 자동 변수입니다. 당신은 아마'* x'에 대해 생각하고있었습니다. –

+0

@KerrekSB 예. "x의 내용이 힙에 할당 됨"을 의미한다고 가정합니다. 명확하게 편집했습니다. – jli

+0

사실,'x'의 내용은 자동 변수의 내용입니다. '* x'의 내용을 생각하고 있었을까요? –

관련 문제