2009-06-29 6 views
5

저는 퍼즐의 일부 C 코드를 가지고 있습니다. 이 코드로 할 이유가 있기 때문에 struct 오브젝트 이 힙 또는 스택으로 끝나는지를 어떻게 알 수 있는지 궁금합니다.스택 또는 힙에 있습니까?

개체하지malloc 또는 calloc로 생성되고있다. 그들은 배열의 형태로 삶을 시작합니다. 이 게시물의 목적을 위해 Emp라는 구조체를 호출 할 것입니다.

Emp myEmp[6]; 

/* Each myEmp[?] item is populated in code */ 

개체는 다양한 방법으로 정렬되고 조작되며 어떤 시점에서 개체는 복사 된 다음 배열 포인터로 전달됩니다. 복사는 memcpy을 통해 이루어집니다. 객체는 다음과 같이 입력됩니다 : Emp* emps_a[6].

개체는 사본에서 이동하여 위 emps_a에 할당됩니다.

int i; 
for(i = 0; i < n; i++) 
{ 
    emps_a[i] = myEmpsCopy + i; 
} 

일부 또는 모든 문제가 궁금한 점이 있는지는 잘 모르겠습니다. 나는 결코 자유()를 필요로하지 않거나 기억을 정리하지 않는다 ... 나는 C에 대해 너무 많이 알지 못한다.

도움을 크게 주신다.

+3

규칙 : malloc을 호출하면 무료로 문의해야합니다. inverse - malloc을 호출하지 않았다면, free를 호출해서는 안된다 - 일반적이지만 항상 그런 것은 아니다. (어떤 함수는 malloc을 호출 할 것입니다. 그렇다면 함수 설명서에 큰 빨간색 글자로 설명해야합니다.) –

답변

17

static 수정 자 (별개의 메모리 영역에 할당 됨)로 선언 된 전역 변수와 변수를 제외하고 함수 본문에 선언 된 지역 변수는 스택에 할당되지만 malloc을 호출하면 해당 힙에 할당됩니다. 또한 C99 가변 크기 배열과 _alloca으로 할당 된 메모리는 스택에 저장됩니다.

int* x[10]; // The addresses are held on the stack 
int i;  // On the stack 
for(i = 0; i < 10; ++i) 
    x[i] = malloc(sizeof(int)*10); // Allocates memory on the heap 

예를 들면, 상기 코드에서, 힙의 10 개 위치에 주소를 유지 스택 int* 값의 배열이있다.

+0

... "static"변수는 아마도 자신의 메모리 영역에 있습니다. –

+0

그래, 전 세계적으로 선언 된 것들과 함께. –

+0

위의 예에서 말하는 모든 것이 스택에 저장됩니다. 힙에서 끝나는 것은 불가능합니다. –

관련 문제