2011-03-04 3 views
1

나는 C 언어를 배우고 있으며 몇 가지 질문이 있습니다. int i = 0과 같은 변수를 선언 할 때. 에 스택에 주소가 있습니다. 맞습니까?C 스택의 데이터 구성?

메모리에서 함수가 어떻게 구성되어 있는지 궁금합니다. 예를 들어, 다음과 같은 함수가 있습니다.

int myF() { 
    int x = 2, y = 3; 
    int z = x + y; 
    return x; 
} 

이 방법은 스택에서 어떻게 구성되어 있습니까? "myF"이라는 이름의 메모리 주소가 다른 varialbes와 너무 비슷합니까? 그리고 "myF"은 기능의 끝 부분을 나타내는 끝 주소와 같아야합니다.

내가 틀렸어?

고마워요.

+1

컴파일러에 따라 C 코드의 어셈블리 목록을 만드는 것이 도움이 될 수 있습니다. 이렇게하면 지침이 표시되고 더 잘 이해할 수 있습니다. –

+1

C는 스택을 지정하지 않으므로 자동 변수가 배치되는 방법과 특정 구현에 따라 달라집니다. – user611775

+2

일반적으로 변수는 스택에서 끝나지만 전체적으로 최적화되거나 레지스터에서만 살 수 있습니다 (예 :). 컴파일러가 코드를 번역 한 방법에 대해 아무 것도 가정하지 마십시오. – pmg

답변

1

다이어그램은 어떻게 구성되어 있는지 보여 도움이 될 것입니다 : 스택에있을 수

Stack layout

  • 지역 변수 (귀하의 예제에서 i을 같은)하지만 컴파일러에 따라 달라집니다. 일반적인 스택 레이아웃은 로컬 변수 영역을 보여줄 것입니다. 예를 들어, 일부 컴파일러는 변수 대신 레지스터를 사용할 수 있습니다.
  • myF 이름에는 주소가 없지만 기능은 수행합니다. 주소는 일반적으로 실행 가능한 코드의 별도 영역에 있습니다.
  • '종료 주소'가 없습니다 - 대신 호출 주소로 저장된 주소가 저장됩니다. myF이 함수의 끝에 도달하여 정리 작업을 수행하면 반환 주소로 분기됩니다. 이 반환 주소를 변경하고 악의적 인 코드가 실행되도록 코드를 분기하려는 일부 악용 사례가 있기 때문에 실제로 문제가 될 수 있습니다.
+0

-1 : 게시물에 너무 많은 단점 – pmg

1

일반적으로 함수의 코드는 읽기 전용 메모리 세그먼트에 별도로 저장되며 스택 ("자동 저장소")과 중복되지 않습니다. 또한 myF이라는 이름은 컴파일 중에 제거되며 함수는 일부 주소에서 시작하여 "현재 함수에서 반환"을 의미하는 특수 프로세서 명령어로 끝나는 코드 조각이됩니다.

1

주소가 스택에 있습니다. 맞습니까?

반드시 그렇지는 않습니다.

이 방법은 스택에서 어떻게 구성되어 있습니까?

답변은 컴파일러와 프로세서 아키텍처에 따라 다릅니다. 일부 컴파일러는 로컬 변수를 스택에 저장합니다. 다른 사람들은 레지스터를 사용할 것입니다.

자세한 내용은 scope of variables을 확인하십시오.

관련 문제