오늘은 C언어의 메모리에 대해 알아보겠습니다.
C언어는 메모리의 관리를 프로그래머에게 맡깁니다.
C언어를 사용하다보면, 메모리를 정적, 동적 등으로 할당하고, 그것을 사용, 관리 합니다.
이것은 장점이 될 수도 있고, 단점이 될 수도 있습니다.
메모리를 잘못 사용하게 되면 C언의 특성상 Segmentfault를 경험하게 됩니다. ( 필자는 아주 많이 경험 해봤습니다. )
이것에 대한 예외처리를 잘 해줘야 문제가 없습니다.
프로세스에서 메모리는 보통 4가지의 종류로 나뉩니다.
1. 텍스트
텍스트 메모리 영역은 실행코드가 존재하는 영역입니다.
소스코드가 컴파일 되어서 만들어진 기계어가 여기 적재 됩니다.
2. 데이터
데이터 메모리 영역은 전역 변수나 정적 심볼들이 존재합니다.
조금더 자세히 나누자면 3개로 나눌 수 있습니다.
-.rodata : 읽기 전용으로 초기화 되는 영역
->const로 선언된 변수들(상수)
ex ) char* p_str = "hello"; 에서 hello는 .rodata 영역, p_str은 .data 영역
-.data : 읽기/쓰기가 가능한 영역으로 초기화 되는 영역
->초기화된 전역 변수
ex ) 전역변수 int num = 1;
-BSS : 초기화되지 않은 영역
->초기화되지 않은 전역 변수나 static 변수
->BSS 영역은 main함수를 실행하기전에 startup함수에 의해 초기화 됩니다.
ex) 전역변수 int num; static int i;
3. 스택
스택 메모리 영역은 임의로 메모리를 잡지 않아도 함수가 시작되면서 생성되고 없어지는 변수들이 존재합니다.
일반적으로 사용하는 함수 안의 지역 변수입니다.
4. 힙
힙 메모리 영역은 malloc, calloc와 같이 동적 할당으로 선언된 변수가 존재합니다.
프로세스가 종료되지 않는 한 자동으로 없어지지 않습니다.
할당, 해제 등 프로그래머가 전적으로 관리를 해야됩니다.
오늘의 포스팅은 여기까지입니다.
감사합니다.
'프로그래밍 > C' 카테고리의 다른 글
[C] TCP 소켓 (0) | 2020.03.09 |
---|---|
[C] socket 함수 (0) | 2020.03.05 |
[C] fflush 함수 (0) | 2019.11.28 |
[C] exec 계열의 함수 (0) | 2019.11.05 |
[C] 배열(array)과 연결리스트(linked list) (0) | 2019.06.19 |