2012-08-06 2 views
0

로컬 기억 장치를 할당하는 데 사용되는 메모리 주소를 조사하는 아주 간단한 C 프로그램이 있습니다. 내 프로그램입니다 :이 C 프로그램에서 메모리 주소가 작동하는 방법에 대한 설명이 필요합니다.

address of buffer_1 0x7fff5fbfec30 
address of buffer_2 0x7fff5fbfec20 
address of buffer_3 0x7fff5fbfec10 

내 질문은 : 왜 주소 할 수는 점점 작아 것 같다

#include <stdio.h> 

int main() 
{ 
    char buffer_1[8], buffer_2[8], buffer_3[8]; 
    printf("address of buffer_1 %p\n", buffer_1); 
    printf("address of buffer_2 %p\n", buffer_2); 
    printf("address of buffer_3 %p\n", buffer_3); 
    return 0; 
} 

출력은 다음과 같다? 이것에 대한 논리가 있습니까? 고맙습니다.

+0

이것 좀보세요 : http : // stackoverflow.co.kr/questions/4560720/why-stack-address-goes-decline-memory-address 또는 this http://stackoverflow.com/questions/1677415/does-stack-grow-upward-or-downward –

+0

모두에게 감사드립니다. 당신의 대답은 대단히 감사합니다! – worker1138

답변

1

컴파일러는 자동 변수로 원하는 모든 작업을 수행 할 수 있습니다. 이 경우에는 스택에 연속적으로 넣는 것처럼 보입니다. 오늘날 사용되는 가장 보편적 인 시스템에서 스택은 아래쪽으로 커집니다.

1

대부분의 컴파일러는 함수의 맨 처음 부분에서 한 단계로 로컬 변수에 스택 메모리를 할당합니다. 메모리는 하나의 연속 블록으로 할당됩니다. 이러한 상황에서, 컴파일러는 분명히 블록 내부의 지역 변수를위한 메모리 레이아웃을 자유롭게 사용할 수 있습니다. 주소를 선언 순서대로 증가 시키려면 주소를 넣을 수 있습니다. 또는 감소. 또는 무작위로 정렬합니다. 구현 세부 사항입니다. 그리고 그 뒤에는 논리가별로 없습니다.

컴파일러가 배열의 메모리를 순차적으로 그리고 독립적으로 (심지어는 그렇지 않더라도) 할당 된 "척"하려고 시도했을 가능성이 큽니다. 플랫폼 스택이 아래쪽으로 커지는 경우 (많은 플랫폼 에서처럼) 나중에 선언 된 객체는 더 작은 주소를 가질 것으로 예상됩니다.

그러나 다시 함수는 로컬 개체를 개별적으로 할당하지 않습니다. 또한이 언어는 로컬 객체 주소 간의 관계에 대한 보장을하지 않습니다. 따라서 다른 주문보다 하나의 주문을 선호하는 실질적인 이유는 없습니다.

1

C 프로그램의 출력은 플랫폼에 따라 다르며 컴파일러에 따라 다릅니다. 주소 배열이 다음에 따라 달라지기 때문에 하나의 완벽한 대답 만있을 수는 없습니다. 시스템이 리틀 또는 빅 엔디 언 여부. 어떤 종류의 OS를 컴파일하고 있습니까? 컴파일 할 메모리 아키텍처의 종류. 어떤 종류의 컴파일러를 사용하고 있습니까 (컴파일러도 버그가있을 수 있습니다) 64 비트 또는 32 비트 플랫폼을 사용하고 있는지 여부. 그리고 훨씬 더.

하지만 가장 중요한 것은 프로세서 아키텍처의 유형입니다.

x86,PDP11 Downwards 
System z  In a linked list fashion, downwards, mostly. 
ARM   Select-able and can grow in either up or downward. 
Mostek6502 Downwards (but only 256 bytes). 
SPARC  In a circular fashion with a sliding window, a limited depth stack. 
RCA1802A  Subject to SCRT(Standard Call and Return Technique) implementation. 

그러나, 일반적으로, 컴파일시 컴파일러는, 생성 된 이진 파일에 해당 주소를 매핑해야합니다 : :)

다음은 프로세서 당 스택 성장 전략의 목록입니다. 그런 다음 런타임에 이진 파일은 메모리 주소의 순차 집합을 점유 할 수 있습니다 (또는 점유 할 수 있습니다). 그리고 귀하의 경우 C 소스가 인쇄 한 주소는 스택이 아래쪽으로 커지고 있음을 보여줍니다.

+0

사용중인 자루 프레임이 하나뿐이기 때문에 스택의 성장 방향에 대한 OP의 예에 대한 증거는 없습니다. –

+0

하나의 스택이 사용 중입니다. 그러나 하나의 스택 내에 여러 개의 스택 프레임이 있습니다. 어쨌든 스택이 컴퓨터에서 어떻게 작동 하는지를 설명하기를 원했습니다. :) – askmish

+0

하나의 함수는 하나의 스택 프레임을 의미합니다. –

0

기본적으로 컴파일러는 모든 변수에 메모리를 할당해야합니다. 배열은 주소를 스택에 가져옵니다. 그러나 당신이 얻고있는 O/P와는 아무런 관련이 없습니다. 기본적으로 컴파일러는 연속 된 공간 (또는 메모리의 덩어리)이 비어있는 것으로 판단하여 프로그램에 할당합니다.

관련 문제