2013-04-30 4 views
1

C 프로그램의 메모리 레이아웃이 텍스트, 힙, 스택, 데이터 및 bss 세그먼트로 나누어 져 있다는 것을 알고 있습니다. 나는이 메모리 레이아웃 만이 다른 스토리지 클래스의 변수 범위와 수명을 유지하는 이유라고 생각한다.C의 메모리 레이아웃의 각 세그먼트에 어떤 데이터 구조가 있습니까?

예를 들어, 자동 변수가 스택에 저장됩니다. 함수 호출이 발생할 때마다 호출 된 함수의 자동 변수에 대한 액세스를 제한하는 새 스택 프레임이 만들어집니다. 그러나 그들은 여전히 ​​관련 프레임 안에 있으며 호출 된 함수가 제어를 반환하자마자 조치를 취합니다.

따라서 우리는 자동 변수의 범위와 유효 기간을 정당화 할 수 있습니다. 그러나 이러한 범위 지정을 유지하기 위해 다른 세그먼트 (즉, 데이터, bss 및 힙)에서 어떤 데이터 구조가 사용되는지 알고 싶습니다. 아니면 범위와 수명을 제어하는 ​​메모리 레이아웃이 아닌 다른 것입니까?

+2

일부 표준 구현 시맨틱과 특정 구현의 세부 사항을 혼동하는 것은 잠재적 인 함정입니다. 귀하의 질문을 조금 명확히 할 수 있습니까? 여기서 정말로 무엇을 이해하려고합니까? –

+0

@Carl이 말한 것에 대해 자세히 설명하려면 다음 인용문을 사용하십시오. * "자동 변수는 스택에 저장됩니다."* 물론 그렇습니다. 내가 알고있는 모든 구현에서 자동 저장 기간을 갖는 변수는 스택 구조에 할당됩니다. 그러나 C * 언어 *는 스택에 아무 ​​것도 말하지 않습니다. 그것들은 다른 방법으로 구현 될 수 있습니다. 스택은 단지 좋은 것입니다. –

+0

** "스코프와 수명을 제어하는 ​​메모리 레이아웃이 아닌 다른 것입니까?"** 컴파일러는 스코프가 표준을 준수하도록 끝난 후에 auto 변수를 파괴하는 호출을 내장 할 수 있습니다. 그러나 우리에게 표준은 표준이 그렇게 말할 때 언제 어디에서 끝나는 지 보증합니다. –

답변

2

원인과 결과가 혼동스러워 보입니다. 변수의 범위와 유효 기간은 언어 표준에 의해 결정됩니다. 구현은 표준이 충족되는지 확인해야합니다. 은 특정 플랫폼에서 편리하게 사용할 수있는 메모리 레이아웃을 사용하지만 그렇게 할 필요는 없습니다.

세그먼트가 텍스트 또는 bbs 인 메모리 레이아웃은 기본적으로 언어가 아닌 실행 형식의 문제입니다.

0

그렇다면 가장 일반적인 경우에 대해 대답 할 수 있습니다. 다른 "세그먼트"에는 범위 나 수명을 제어 할 수 없습니다. 데이터 및 bss (초기화 된 및 초기화되지 않은 전역/정적 변수 각각)는 프로세스 기간 동안이며 힙은 mallocfree을 통해 명시 적으로 관리됩니다 (프로세스가 종료 될 때 전체 힙이 삭제 될 때까지).

나는 "Viz"를 모른다. 그래서 나는 이것에 대답 할 수 없다.

+0

* viz. *는 대략적으로 라틴어 약어로, * 구체적으로 *입니다. –

관련 문제