2016-10-02 7 views
3

이것은 quicksort 알고리즘의 간단한 재귀 함수이며이 함수에서 return 문을 찾지 못했기 때문에 마지막 재귀 이후에 스택을 비우지 않습니까?void 함수에서 return 문을 쓰지 않으면 스택 메모리를 차지합니까?

void quicksort(int arr[], int p, int r){ 
    int q = partition(arr, p, r); 
    if(p < r){ 
     quicksort(arr,p, q-1); 
     quicksort(arr,q+1, r); 
    } 
} 

이 기능은 그래서 반환 statemnt가없는 재귀 함수는 영원히 스택에 남아있을 것 또는 지금까지 비워받을 수 있습니까?

+0

'p> = r' 일 때 재귀가 끝납니다. –

+0

닫는'}'바로 전에 암시적인'return' 문이 있습니다. 일반적으로 바보 같은 일을하는 도구 (언어, 컴파일러)는 빨리 사라지는 경향이 있다는 것을 명심하는 것이 유용합니다. –

+0

그것은'void' 함수이므로 반환 값이 필요하지 않습니다. 또한 일반적으로 함수 코드가 아닌 스택을 지우는 호출자 코드가 있습니다. 마지막으로'void' 함수의 끝에는 항상 암묵적인'return;이 있습니다. –

답변

4

결국을 종료하면 기능의 스택 프레임이 지워져 이 삭제됩니다.

명백한 return 문이 발생하지 않아도됩니다. 프로그램 흐름이 닫는 중괄호를 지나면 함수는 어쨌든 종료되고 스택 프레임은 지워집니다.

return (비록 C가 아님)없이 함수가 종료 될 수있는 또 다른 일반적인 방법은 예외를 throw하는 것입니다. 다시 스택 프레임이 지워집니다.

+0

미래의 리더가'return' 문을'exit' 호출과 혼동하지 않도록하기 위해 "결국 * 끝낼 때 *"대신 "when it * finally *"대신에 "until * returns *"라는 문구를 사용합니다. –

+1

@AndrewHenle 재미있는 점은 return 문 대신에 "return"대신 "exit"라는 단어를 특별히 선택했기 때문에 모호성을 피하기 위해서입니다. : D – Jon

+0

@AndrewHenle 나는 그가 기능을 언급하고 있기 때문에 혼동이 없다고 생각한다. – m0skit0

1

일반적으로 void 함수의 문은 함수 본문 끝까지 도달하기 전에 반환하려는 경우에만 필요합니다. 마지막 줄 return 문은 불필요하며 무시할 수 있습니다. 스택은 return의 유무에 상관없이 청소됩니다.

0

이 함수에는 반환 구문이 없으므로 순환 함수 은 계속 스택에 남아있게됩니까? 아니면 비워 둘 수 있습니까?

void 함수의 경우 코드가 끝나면 끝납니다. 여기서 void 함수는 p> = r 일 때 끝납니다. 스택 프레임은 끝나면 제거해야합니다. 코드 끝에있는 마지막 닫는 중괄호 '}'는 암시 적 return 문이므로 반환 할 필요가 없습니다.

void 함수의 끝에 명시 적 '반환'이 필요하지 않습니다. 그러나 함수/코드의 끝에 도달하기 전에 특정 조건에서 빠져 나오면 void 함수에서 'return'을 사용할 수 있습니다. 함수가 코딩 가이드 라인/연습으로 끝난 곳을 모호하게하지 않으려면 void 함수 끝에 'return'을 사용할 수도 있습니다.