2016-10-18 2 views
-1

로컬 변수가 주 메모리와 스택 메모리에 있다는 것을 알고 있습니다. 주 기능의 주소를 인쇄하면 로컬 변수의 주소와 주소가 인쇄됩니다. malloc, 지역 변수가 malloc 주소에 더 가깝고 주요 fuction 주소에 더 가깝지 않은 것 같습니다. 왜? 코드 : 스택, 코드 및 데이터의c의 지역 변수가 스택 메모리 근처에있는 것 같습니다.

int g; 

int main(int argc, char** argv) { 
    int l; 
    printf("Adress of main fuction: %d\n", main); 
    printf("Adress of a global variable(g): %d\n", &g); 
    printf("Adress of a local variable(l): %d\n", &l); 
    printf("malloc: %d\n", malloc(10)); 
} 
+3

왜 더 가까이 있지 않아야합니까? 아니면 더? 컴파일러와 운영체제는 원하는대로 자유롭게 사용할 수 있습니다. –

+3

그리고 주소를 출력하기 위해'% d'을 사용하지 마십시오 - 이것은'% p '가 무엇을위한 것입니까. –

+0

그 주소를 말씀해 주시겠습니까? – Swanand

답변

2

정확한 레이아웃은 완전히 컴파일러에 달려있다.

이것은 구현이 정의한 동작이므로 컴파일러마다 다를 수 있습니다.

0

아니오 함수는 지역 변수 및 "전역 변수"와 비교할 때 다른 메모리에 있습니다.

가상 주소는 프로세스의 특정 인스턴스가 주소가 겹치지 않고 다른 세그먼트를 유지하기에 충분히 달라야합니다.

스택을 포함하려면 충분히 멀리 떨어져 있다고 생각합니다.

[email protected]:~/temp/weirdtest$ ./weirdtest 
Adress of main fuction: 4195709 
Adress of a global variable(g): 6295628 
Adress of a local variable(l): 29174716 
malloc: 17440784 
1

auto 변수는 변수를 사용하는 코드 근처에서 인스턴스화 할 필요가 없습니다. C가 배열 검사 접근을 제한하지 않는다는 것을 감안할 때 이는 좋은 일입니다. 그렇지 않으면 바이너리 코드를 직접 패치하기 위해 버퍼 오버런을 사용할 수 있습니다.

   +------------------------+ 
high address | Command line arguments | 
       | and environment vars | 
       +------------------------+ 
       |   stack   | 
       | - - - - - - - - - - - | 
       |   |   | 
       |   V   | 
       |      | 
       |   ^   | 
       |   |   | 
       | - - - - - - - - - - - | 
       |   heap   | 
       +------------------------+ 
       | global and read- | 
       |  only data  | 
       +------------------------+ 
       |  program text  | 
    low address | (machine code)  | 
       +------------------------+ 

자세한 사항은 구현에 따라서 다릅니다 만, 그 큰 그림이 꽤 일반적입니다 :

여기 (항상은 있지만) (가상) 메모리에 배치 프로그램은 전형적 방법입니다. 기계 코드는 데이터에서 분리되고 전역 및 읽기 전용 데이터는 스택 및 힙과 분리됩니다.

+0

ASCII 다이어그램을 만드는 데 걸리는 시간은 어느 정도 가치가 있습니다. – ryyker