해당 게시글은 동영상 강좌 - 동영상 강좌 - 'Do it! C언어 입문' - 16장 메모리 할당 (1/2)
를 학습하며 정리한 글입니다.
게시글에 작성된 그림은 모두 업로드된 유튜브 영상에서 캡처해온 것입니다.
프로그래밍에서 메모리 할당은 수행속도를 고려하여 데이터 처리를 효율적으로 하기 위한 중요한 파트다. C언어 포인터보다 어려울 수 있으나 효과적으로 설계하려면 필수.
프로그램 : 프로그래머가 만든 프로그램 실행 파일
프로세스 : CPU가 실행 파일에 있는 명령들을 실행할 수 있도록 OS가 실행 파일의 명령들을 읽어서 메모리에 재구성한 것. 실행중인 프로그램이라고 함. 세그먼트(여러 정보나 데이터를 기억하는 메모리 공간)의 집합으로 구성됨.
세그먼트는 다음 그림과 같이 구성됨(코드 세그먼트, 데이터 세그먼트, 스택 세그먼트)
메모리 할당은 두 가지(정적, 동적 메모리할당)로 구분된다.
1. 정적 메모리 할당
변수가 메모리에서 유지되는 시간
정적으로 할당된 메모리를 관리하는 방법
지역변수를 시작 위치 포인터(START)와 끝 위치 포인터(END)를 사용하여 관리할 수 있다. 만약, 이렇게 하지 않으면 a,b,c,d 각각에 대한 포인터를 전부 관리해야한다!
그렇다면, start + @ 값만 하던데 왜 end가 필요할까요? C언어는 함수의 집합체 이기 때문에, end는 특정 변수를 가리키기 위한 게 아니라 다음에 할당된 함수를 위해 설정된 값. end가 있음으로 다음 함수가 시작될 값을 설정해주기 때문에, 다른 필요없는 포인터를 더 만들 필요가 없어짐.
컴파일러가 지역 변수를 저장할 메모리 공간을 확보하는 방법
컴파일러가 스택에 할당된 지역변수를 사용하는 원리
베이스 포인터(BP)를 사용하여 스택에 할당된 지역 변수 사용한다.
스택 프레임이란?
정적 메모리 할당의 한계
char data[1024*1024]; // 단일 변수가 1MByte를 넘어 오류발생
short *p = (short *)malloc(100);
int *p = (int *)malloc(100);
*malloc 함수를 사용할 때 주의할 점!
1. free를 사용하지 않으면, 메모리 할당을 끝내지 않는다. 함수가 종료되더라도, free를 사용하지 않았다면 메모리 할당은 끝없이 일어난다
-> malloc과 free는 세트로 만들고 코딩을 시작해야한다.
-> 버그 중에 제일 잡기 힘든 버그..
할당되지 않은 메모리를 해제하면 실행 시 오류가 발생
-> 포인터 선언, free를 사용해놓고 메모리 할당을 하지 않음
동적 할당된 주소를 중복 해제하면 실행 시 오류가 발생
배열과 비슷한 형식으로 동적 메모리를 사용할 수 있다.
-> 예)12바이트로 할당된 포인터를 3개의 4바이트(int)로 나눠서 사용하겠다.
-> int *p를 int data[3];으로 사용할 수 있다.
배열의 단점1 : 기본적으로 스택을 쓰기 때문에 1MByte밖에 못 쓴다.
배열의 단점2 : int data_size = 3; int data[data_size]; 는 오류가 발생. 배열의 요소 개수는 상수로만 명시되기 때문
동적 메모리를 할당하는 또 다른 방법
int *p = (int *)malloc(12); // 라고도 쓸 수 있지만
int *p = (int *)malloc(sizeof(int) * 3); //으로 쓰는 게 더 좋다!
short *p = (short *)malloc(sizeof(short)*6); // 다른 프로그래머들과 협업할 때도 좋다
정적 메모리 할당을 사용하여 숫자를 입력 받아 합산하기
-> 단점 : 코드는 간단할지 몰라도, 메모리가 낭비되거나 수정하려면 다시 컴파일 해야함.
#include <stdio.h>
#define MAX_COUNT 5
void main(){
int num[MAX_COUNT], count = 0, sum = 0, i;
while(count < MAX_COUNT){
printf("숫자 입력 : ");
scanf("%d", &num[count]);
if(num[count] == 9999) break;
count++;
}
for (i=0; i < count; i++){
if(i > 0) printf(" + ");
printf("%d", num[i]);
sum = sum + num[i];
}
printf(" = %d\n", sum);
}
malloc 함수를 사용하면, 변수로 메모리 동적 할당 가능
int data_size = 12;
int *p = (int *)malloc(data_size); //데이터 개수(MAX_COUNT)를 따로 지정할 필요가 없음
#include <stdio.h>
#include <malloc.h>
void main(){
int *p_num_list, count = 0, sum = 0, limit = 0,i;
printf("사용할 최대 개수 입력 : ");
scanf("%d", &limit);
p_num_list = (int *)malloc(sizeof(int) * limit);
while(count < limit){
printf("숫자 입력 : ");
scanf("%d", p_num_list + count);
if(p_num_list[count] == 9999) break;
count++;
}
for (i=0; i < count; i++){
if(i > 0) printf(" + ");
printf("%d", *(p_num_list + i));
sum = sum + *(p_num_list + i);
}
printf(" = %d\n", sum);
free(p_num_list);
}