변수가 코드 블록 내에서 선언되면 해당 범위는 변수에 액세스할 수 있는 코드 부분을 정의합니다. . 하지만 범위가 끝나면 변수에 할당된 메모리는 어떻게 되나요? 즉시 덮어쓰나요, 아니면 해당 함수가 종료될 때까지 예약된 상태로 유지되나요?
이 질문은 다음 코드 조각에서 발생합니다.
foo() { int *p; { int x = 5; p = &x; } int y = *p; // undefined behavior }
변수 x의 메모리가 범위를 벗어난 후에도 여전히 할당되면 포인터 p는 계속해서 올바른 위치를 가리키므로 더 이상 범위에 있지 않더라도 x 값에 액세스할 수 있습니다. 범위.
이 수수께끼를 풀려면 범위와 수명의 개념을 파헤쳐야 합니다.
범위는 코드 섹션을 포함합니다. 변수에 접근할 수 있습니다. 변수가 중괄호({}) 안에 선언되면 해당 범위는 포함된 코드 블록으로 제한됩니다.
수명은 변수 또는 변수가 선언된 기간을 포함합니다. 개체가 유효한 상태로 존재합니다. 자동 또는 로컬 비정적 변수의 경우 수명은 해당 범위로 제한됩니다. 즉, 이러한 변수는 해당 범위가 끝나면 자동으로 삭제됩니다.
지정된 코드 조각에서 변수 x는 비정적 지역 변수로 선언됩니다. , 즉 수명이 해당 범위에 묶여 있음을 의미합니다. 내부 범위가 끝나면 x는 더 이상 존재하지 않고 포인터 p는 더 이상 유효하지 않은 위치를 가리키게 됩니다.
결과적으로 p를 통해 x 값에 액세스하려는 시도는 정의되지 않은 동작입니다. 컴파일러는 해당 범위를 넘어서 x에 메모리를 할당할 수도 할당하지 않을 수도 있으며 이로 인해 예측할 수 없는 결과가 발생할 수 있습니다. 따라서 범위가 종료된 변수에 액세스하지 않는 것이 중요합니다.
위 내용은 범위가 종료된 후 변수 메모리는 어떻게 되나요? 즉시 덮어쓰거나 함수가 끝날 때까지 예약됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!