it-source

스택 및 힙의 메모리 할당

criticalcode 2023. 9. 23. 22:46
반응형

스택 및 힙의 메모리 할당

이것은 아주 기본적인 질문처럼 보일 수도 있지만, 제 머릿속에는 이런 것들이 있었습니다.

로컬 변수를 할당하면 스택으로 이동합니다.마찬가지로 동적 할당으로 인해 변수가 힙 상태로 전환됩니다.자, 제 질문은 이 변수가 실제로 스택이나 힙에 있는지 아니면 스택과 힙에 있는 참조일 뿐인지 입니다.

예를들면,

합니다를 한다고 가정해 .int i, . , .i스택에 할당됩니다.때.i가 스택에 중 요?힙에 대해서도 같은 질문입니다.

무슨 말인지는 잘 모르겠지만 최선을 다해 대답해 보겠습니다.

합니다를 합니다.i스택에 저장됩니다.

int i;

할 때 ㅇ&i스택의 실제 위치를 파악했습니다.

으로 무언가를 할 때malloc, 실제로 두 의 데이터가 저장되어 있습니다.동적 메모리는 힙에 할당되고 포인터 자체는 스택에 할당됩니다.그래서 이 코드에서:

int* j = malloc(sizeof(int));

이것은 힙의 공간을 정수에 할당하는 것입니다.입니다)를 위해 j . .j은 의됩니다.malloc.

다음이 도움이 되기를 바랍니다.

void foo()
{
    // an integer stored on the stack
    int a_stack_integer; 

    // a pointer to integer data, the pointer itself is stored on the stack
    int *a_stack_pointer; 

    // make a_stack_pointer "point" to integer data that's allocated on the heap
    a_stack_pointer = (int*)malloc(10 * sizeof(int));
}

스택 변수의 경우 변수 자체(실제 데이터)가 스택에 저장됩니다.

힙 할당 메모리의 경우 기본 데이터는 항상 힙에 저장됩니다.이 메모리/데이터에 대한 포인터는 스택에 로컬로 저장될 수 있습니다.

도움이 되길 바랍니다.

포인터 변수 자체가 스택에 상주합니다.포인터가 가리키는 메모리가 힙에 상주합니다.

int *i = malloc(sizeof(int));

i입니다를 입니다. 제가 가리키는 실제 메모리입니다.*i산더미 위에 있을 겁니다

크리스의 의견에 동의합니다.그것을 설명하는 또 다른 방법입니다.다음 코드를 생각해 보십시오.

int* j = malloc(sizeof(int));
free(j);

힙에서 메모리를 할당 해제해야 하는 free(j)를 사용한 후에도 포인터는 여전히 존재하며 NULL로 명시적으로 만들어야 합니다.이것은 분명히 포인터의 스택 대응물도 존재한다는 것을 의미합니다. 그렇지 않으면 free 명령 뒤에 존재하지 말았어야 합니다.이 스택 변수는 malloc을 사용하여 메모리가 동적으로 할당된 힙의 주소를 가리키는 변수입니다.

Mr. Eberle의 답변은 100% 맞지만, 구글은 이것을 검색할 때 첫번째 답변으로 보여주기 때문에malloc heap or stack, 저는 그것을 추가해야 합니다.malloc()대부분의 시간에 힙에 데이터를 할당합니다.할당된 데이터가 보통 32비트 시스템에서 128kb인 것보다 크다면,malloc()는 힙을 사용하지 않고 대신 일반적으로 스택 아래에 위치한 익명 메모리 세그먼트에 데이터를 할당하여 메모리가 부족한 방향으로 증가합니다.

동적으로 로드된 라이브러리가 위치한 영역과 동일한 영역입니다(libc.so, 등).다음은 관련된 내용입니다.

일반적으로 malloc()는 힙에서 메모리를 할당하고 필요에 따라 sbrk(2)를 사용하여 힙의 크기를 조정합니다.MMAP_THRESHOLD 바이트보다 큰 메모리 블록을 할당할 때, glibc malloc() 구현은 mmap(2)을 사용하여 메모리를 개인 익명 매핑으로 할당합니다.MMAP_THRESHold는 기본적으로 128kB이지만 mallopt(3)를 사용하여 조정할 수 있습니다.Linux 4.7 이전 버전에서는 mmap(2)을 사용하여 할당을 수행했지만 RLIMIT_DATA 리소스 제한에 영향을 받지 않았습니다. Linux 4.7 이후에는 mmap(2)을 사용하여 수행한 할당에도 이 제한이 적용됩니다.

실질적인 예로, 아래의 게시물을 언제든지 확인할 수 있습니다.기본적으로 300kb 를 할당합니다.malloc()그리고 달려갑니다.pmap <PID>관련 메모리 세그먼트를 표시합니다.

스택이나 힙은 별개의 메모리가 아니라 실행 중인 프로그램이 시스템에 의해 할당되는 메모리 세그먼트이며, 단지 메모리에서 데이터를 구성하는 다른 방식입니다.

그래서 당신이 &i를 얻었을 때, 그것은 단순한 메모리 주소입니다.

언급URL : https://stackoverflow.com/questions/6770596/memory-allocation-in-stack-and-heap

반응형