C 공부하다가 메모리 구조 부분에서 막혔어요. 프로그램 실행되면 메모리가 코드, 데이터, 힙, 스택 이렇게 나뉜다는 그림은 봤는데, 정작 스택이랑 힙이 뭐가 다른 건지 감이 안 잡히네요.


제가 지금 이해한 걸로는 이런 코드가 있을 때,


void func() {
    int a = 10;
    int *p = malloc(sizeof(int));
    *p = 20;
}


여기서 a는 스택에 올라가고 malloc으로 잡은 20은 힙에 올라간다, 대충 이 정도까지는 들었어요. 근데 왜 굳이 나눠 놓은 건지, 그리고 포인터 변수 p 자체는 또 어디 있는 건지 이런 게 자꾸 꼬여요.


궁금한 거 정리하면,

1. 스택에는 뭐가 올라가고 힙에는 뭐가 올라가나요? 기준이 뭔가요

2. 함수 끝나면 a는 자동으로 사라지는데 힙에 잡은 건 왜 free 안 하면 안 없어지는 거예요

3. 스택이 힙보다 빠르다는 말도 들었는데 그건 또 왜 그런 건가요


그냥 외우기만 하니까 자꾸 까먹어서 원리를 알고 싶어요. 초보라서 쉽게 설명해 주시면 감사하겠습니다.