C 공부하다가 메모리 구조 부분에서 막혔어요. 프로그램 실행되면 메모리가 코드, 데이터, 힙, 스택 이렇게 나뉜다는 그림은 봤는데, 정작 스택이랑 힙이 뭐가 다른 건지 감이 안 잡히네요.
제가 지금 이해한 걸로는 이런 코드가 있을 때,
void func() {
int a = 10;
int *p = malloc(sizeof(int));
*p = 20;
}
여기서 a는 스택에 올라가고 malloc으로 잡은 20은 힙에 올라간다, 대충 이 정도까지는 들었어요. 근데 왜 굳이 나눠 놓은 건지, 그리고 포인터 변수 p 자체는 또 어디 있는 건지 이런 게 자꾸 꼬여요.
궁금한 거 정리하면,
1. 스택에는 뭐가 올라가고 힙에는 뭐가 올라가나요? 기준이 뭔가요
2. 함수 끝나면 a는 자동으로 사라지는데 힙에 잡은 건 왜 free 안 하면 안 없어지는 거예요
3. 스택이 힙보다 빠르다는 말도 들었는데 그건 또 왜 그런 건가요
그냥 외우기만 하니까 자꾸 까먹어서 원리를 알고 싶어요. 초보라서 쉽게 설명해 주시면 감사하겠습니다.