이해한게 맞는지 질문드립니다!
217
작성한 질문수 13
안녕하세요~
항상 자세한 답변 감사드립니다
#include <stdlib.h>
int count() {
double* ptr = NULL;
ptr = (double*)malloc(30 * sizeof(double));
for(int i = 0; i < 30; i++) {
*(ptr + 1) = i;
}
}
int main() {
count();
}
이렇게 작성한경우,
ptr에 할당된 메모리 공간들은 malloc때문에 메모리 영역 중 heap 영역에 240 바이트만큼 저장된다는건 알겠는데요,
만약 main문에서 count가 호출될때 ptr은 지역변수니까 스택에 저장되어있겠죠?
그런데 count가 종료될 경우 스택영역에서 pop되니까 메모리공간에 for문 돌면서 초기화 해준 값들이 분명 heap영역에 존재는 하는데 이걸 참조를 못하게 된다 이소리인가요?
중간에 마치 친구 전화번호를 종이에 적어서 가지고있었는데 잃어버렸다. 근데 전화번호적은 종이를 잃어버렸다고 친구가 사라지는건 아니다 라고 비유를 드셨는데 맞게 이해한건지 궁금합니다.
ps. 혹시 for문에서 double이 8바이트니까 30번돌면 되는거 맞나요?
답변 1
4
네 제대로 이해하고 계십니다. 저 비유가 딱 맞아요! 집 주소가 적힌 종이를 잃어버려서 집을 영영 찾지 못하게 된 경우와도 같아요. 지역변수인 ptr은 사라지는데, heap 은 프로그래머가 직접 free 코드로 메모리 해제 시켜주어야지만 메모리가 해제되므로 ptr 이 참조하고 있던 그 힙 메모리는 count 함수가 호출이 끝나도 계속 메모리에 자리를 차지하고 있게 됩니다. 근데 이 메모리의 주소를 ptr 이 가지고 있엇는데 ptr 이 사라졌으니 이 메모리에 접근할 수 있는 방법은 영영 사라진 것이 되겠죠. 해제도 못하고 이도저도 못할거에요. 그런데 메모리에 용량은 차지하고 있으니 비효율적이죠. 이런 현상이 바로 "메모리 누수"입니다. 그래서 힙 메모리를 사용하시면 잊지 않고 free 코드로 메모리 해제해주셔야 해요. 특히 질문주신 경우처럼 이 메모리를 참조하는 포인터의 수명이 한정적이라면 더더욱 까먹지 말고 free 코드를 써주어야겠습니다.
ps . 네 맞습니다 포인터 산술연산 기억을 되살려보시면 될 것 같아요! ptr은 double 을 가리키는 포인터이기 때문에 *(ptr + 1) 은 곧 주소값이 8 만큼 증가된다는 의미와도 같습니다. 그러니 30번 돌리시는게 맞습니다.
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
43
3
main 함수에서 왜 int만 선언이 되는걸까요
1
51
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
52
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
46
1
프로토타입과 함수간의 인자 불일치
1
72
2
12.12 헤더 관련 질문
1
59
2
Visual Studio Community 2026 사용 문의
1
132
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
59
2
getchar(), putchar()
1
92
3
강의자리ㅛ
1
78
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
112
2
소스파일안에 여러 파일
1
74
2
F5와 F7의 차이
1
75
2
c = TWO * (a+b); 에서 a와 b는?
1
58
2
; 세미콜론을 붙이는 기준에 문의
1
68
1
Step over 기능 문의
1
52
2
2.6 강의 따옴표 출력 규칙 문의
1
74
2
int main 함수 관련 오류 문의
1
67
2
13.4 words[0]
0
60
2
11.7 함수를 구현해 봤습니다.
1
62
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
64
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
53
2
11.6 fit_str함수를 구현해 봤습니다.
1
53
2
11.5 코드 구현
1
66
2





