cs50 5강 메모리 다루기
malloc과 free
c언어에서 첫번째 벽이 포인터라면 아마 두번째 벽은 메모리를 직접적으로 만질 수 있다는 장점을 가진 malloc
calloc
그리고 free
일 것이다.
우선 malloc은 앞에 문자열 챕터에서도 잠깐 맛을 보았듯 메모리를 내가 원하는 크기만큼 빼놓는 방식이다.
malloc과 calloc
이 둘의 기능은 유사하다.
심지어는 매개변수 또한 2개를 가지고있다.
결론부터 말하자면 calloc는 할당된 공간의 값을 모두 0으로 바꾸어주므로, int배열의 메모리를 만지는 상황이라면 memset을 따로 쓰지 않아 편리성이 극대화된다는 차이가 있다.
calloc사용법
calloc함수의 원형 함수는 다음과 같다.
void* calloc(size_t 개수, size_t 크기 단위)
//예를 들어 sizeof(char)이 두번째 인자로 들어가고 첫번째 인자로 4가 들어가면 4개의 char을 받을 수 있는 크기 만큼 공간이 할당된다.
유의할 것은 0으로 초기화되기 때문에 문자열을 담을 때에는 ‘A’아스키 코드값을 더해야 내가 원하는 값을 얻을 수 있다.
free는 왜 써야할까
한마디로 설명하자면 c언어가 구닥다리 언어이기 때문이다.
메모리를 할당한 뒤에 해제를 하지 않으면 메모리 누수 현상이 발생하여 낭비가 심해진다.
또한 낭비가 심한 상황이 계속된다면 프로그램이 지나치게 무거워지거나, 예기치 못한 종료 오류를 뿜내면서 종료가 되는 현상까지 일어날 수도 있다.
c언어에서 원소 교환하기
c언어에서 원소를 교환하기 위해서는 temp함수를 하나 더 써야한다.
즉 a와 b를 교환하기 위해서는 임시로 a값을 담을 그릇이 필요하다는 것이다.
기본적은 구성은 a의 내용물->temp->a에는 b담기->b에는 temp담기
로 이루어져있다.
이때 주소값을 출력해보면, 내용물이 바뀌었음에도 주소값은 바뀌지 않은 것을 확인할 수 있다.
이는 내용물이 바뀌어도 그릇은 그대로이기 때문이다.
code
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a; // a의 내용물을 temp에 저장
*a = *b; // a에는 b의 내용물을 담기
*b = temp; // b에는 temp의 내용물을 담기
}
int main() {
int x = 10;
int y = 20;
printf("교환 전: x = %d, y = %d\n", x, y);
swap(&x, &y); // 주소를 전달하여 값 교환
printf("교환 후: x = %d, y = %d\n", x, y);
return 0;
}
메모리의 영역
메모리의 영역은 크게 스택 힙 데이터 영역이 있다.
컴퓨터가 메모리의 영역을 나누어 사용하는 것은 철처하게 효율성을 위해서이다.
또한 각 공간마다 크기를 다루게 해두고, 다른 역할을 부여함으로써 개발자가 보다 기계친화적으로 생각할 수 있도록 도와주는 역할 역시 해준다.
🔎힙영역
malloc, calloc,free등 우리가 할당하고 해제한 메모리가 들어간다.
당연 해제를 하면 메모리가 해제만큼 줄어들고, 할당을 하면 다시 늘어나는 방식이기 때문에 힙 영역의 크기는 유동적이다.
🔎스택 영역
프로그램의 함수와 관련된 것들이 저장되므로, 지역변수 역시 여기에 들어간다.
그러나 이 스택 영역은 여러겹의 층으로 나누어진 것처럼 돌아가기 때문에 각각의 변수들은 다른 저장공간(주소값)을 가지게 되는 것이다.
데이터 영역
static변수나 전역변수를 저장하는 공간이다.
참고로 define을 통해 정의한 매크로 함수의 경우 데이터 영역에 들어가는 것이 아니라, 코드 영역에서 미리 해석을 하여 컴파일이 된다.
댓글남기기