2010-06-22 5 views

답변

3

C 언어 자체는 스택 사용을 요구하지 않습니다. 구현보다는 동작을 정의합니다.

그러나, 일반적인 경우에, 상기 프로그램 스택이 몇 가지 저장하는 데 사용된다 auto 저장 기간 (. 즉, 통상, 비 static 로컬 변수) 선언

  • 개체;
  • 함수 매개 변수;
  • 복귀 주소 (return; 또는 현재 기능의 끝에 도달 한 후 실행이 재개되어야하는 코드의 위치).
  • 비표준 메모리로 할당 된 메모리 alloca();
  • 레지스터의 저장된 내용, alloca()의 하우스 키핑 정보, 계산에 사용되는 가변 길이 배열 및 중간 값의 크기와 같이 임시 값이 필요합니다.

이 목록은 포괄적 인 목록이 아니며 Trampolines과 같은 이국적인 것들이 스택에 저장되는 경우가 있습니다. 일반적으로 현재 함수가 호출자에게 반환 된 후에는 필요하지 않은 작업 항목의 임시 저장 영역입니다.

디버거의 "백 트레이스"는 스택 내용의 일부 (전부는 아님)를 보여줍니다.

+0

당신이 pl 수 있습니다. alloca()에 대한 포인터를 주시겠습니까? – KedarX

0

이었다 함수 호출의 시리즈는 링크가있는 아래에 당신에게 더 나은 아이디어가 메모리 손상 happens.that 스택 추적하기 전에 스택 트레이스를 제공 Variables and Memory

을 제공 할 수 있습니다 참조 전달 된 주장들과 함께 만들어졌다.

+0

메모리 덤프가 코어 덤프와 다르다고 생각했습니다. 또한 프로그램 스택의 내용은 무엇입니까? 함수를 3 회 반복 호출하고 함수에 2 개의 로컬 변수, 2 개의 정적 변수, 2 개의 동적 할당 포인터 및 2 개의 전역 변수가 있다고 가정 해 보겠습니다. –

+0

@Praveen 정적 변수는 스택 프레임의 일부가 아니며 동적으로 할당 된 포인터는 힙에 있고 함수에는 전역 변수가 없거나 전역 변수가 아닙니다. [오라이의 대답] (http://stackoverflow.com/questions/3090333/what-are-the-exact-contents-of-a-program-stack-in-c/3090400#3090400) 스택 프레임에있는 내용을 다룹니다. ; 각각의 호출에 대해 하나씩있을 것입니다. –

+0

@Michael Mrozek - 컴파일러에 의해 최적화되거나 인라인되거나 달리 컴파일 된 호출을 제외하고 컴파일러는 특정 호출 규칙 또는 ABI를 구현할 필요가 없습니다. –

2

스택은 서브 루틴 인수, 로컬 변수 및 서브 루틴의 리턴 주소가 들어있는 메모리 영역입니다.

인텔에 포함 된 많은 아키텍처에서 스택은 위에서 아래로 자랍니다. 스택 포인터는 데이터가 스택에 푸시 될 때마다 감소합니다.

일반적인 함수 호출 순서는 다음과 같이 표시됩니다

  • 푸시 (스택에 반환 주소를 밀어) 서브 루틴에 인수
  • 점프 일부 언어에서
  • (파스칼, 예를 들어, 기본 포인터가 스택에 푸시됩니다.
  • 호출 된 서브 루틴은 로컬 변수에 대해 스택에 공간을 할당합니다.

스택 추적을 생성하기 위해 런타임 환경은 리턴 주소가 가리키는 곳을 판별하기 위해 단순히 스택을 스캔합니다. "간단하게"썼지 만 기본 포인터가 스택에 저장되지 않으면 간단하지 않습니다. 현재 포인터 이외의 스택 프레임이있는 위치를 결정할 수 없기 때문입니다.