로컬 변수에서 값 반환: 놀라운 동작
프로그래밍에서 로컬 변수는 일반적으로 스택 메모리에 저장됩니다. 함수가 반환되면 연결된 스택 프레임이 제거되고 그 안의 변수에 더 이상 액세스할 수 없습니다. 그러나 지역 변수에 대한 참조를 반환하려고 하면 특이한 동작이 발생합니다.
제공된 코드 조각에서 볼 수 있듯이:
int& foo() { int i = 6; return i; } int main() { int i = foo(); std::cout << i << std::endl; std::cout << &i << std::endl; }
이 코드는 일반적인 스택 규칙과 모순되는 것 같습니다. 메모리 관리. 함수가 반환될 때 foo 함수의 지역 변수 i가 스택에서 제거된다는 사실에도 불구하고 참조된 값은 기본 함수에서 계속 액세스할 수 있습니다.
이러한 비정상적인 동작은 대부분의 방식에서 특이한 동작으로 인해 발생합니다. 컴파일러는 함수 호출을 구현합니다. 함수가 호출되면 컴파일러는 함수의 지역 변수와 매개변수를 위해 스택에 메모리 블록을 예약합니다. 함수가 실행되는 동안 스택에 할당된 메모리는 보호되어 다른 함수가 해당 메모리에 액세스하지 못하도록 합니다. 그러나 함수가 반환되면 메모리 보호가 즉시 제거되지 않습니다. 대신 컴파일러는 다음 함수가 호출될 때까지 또는 현재 스택 프레임이 더 이상 필요하지 않을 때까지 기다립니다.
foo 함수의 경우 컴파일러는 스택의 지역 변수 i에 메모리를 할당합니다. 함수가 반환되면 i의 반환 값은 다음 함수 호출이나 호출자의 스택 프레임을 위해 예약된 위치에 배치됩니다. 이는 foo에 대한 스택 프레임이 제거되더라도 지역 변수 i에 할당된 메모리는 그대로 유지되며 반환된 참조를 통해 액세스할 수 있음을 의미합니다.
이 동작은 컴파일러 및 구현에 따라 다르다는 점에 유의하는 것이 중요합니다. . 일부 컴파일러는 함수가 반환된 후 즉시 메모리 보호를 제거하여 정의되지 않은 동작을 반환한 후 지역 변수의 메모리 위치에 액세스하도록 선택할 수 있습니다. 따라서 지역 변수에 대한 참조를 반환하는 것은 일반적으로 피해야 하며 안전하지 않은 코딩 관행으로 간주됩니다.
위 내용은 C에서 지역 변수에 대한 참조를 반환하는 것이 때때로 가능한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!