15강 동적 메모리 할당

14강 동적 메모리 할당

동적 메모리 할당의 원리를 배운다.
동적 메모리 할당을 용ㅇ해 프로그램 실행 도중에 메모리가 할당되도록 할 수 있다.

C언어에서 배열의 경우 사전에 적절한 크기만큼 메모리를 할당해주어야 한다.
그러나 우리가 원하는 만큼만 메모리를 사용하고자 한다면 '동적 메모리 할당'을 사용한다. 동적이라는 말은 '프로그램 실행 도중에'라는 의미이다.

14-1. malloc()함수

C언어의 동적 메모리 할당 함수이다. 원하는 만큼의 메모리 공간을 확보할 수 있다. 메모리 할당에 성공하면 주소를 반환하고, 실패하면 NULL울 반환한다. <stdlib.h> 라이브러리에 정의되어 있다.

동적 메모리를 할당할때마다 할당되는 포인터의 주소는 매번 다를 수 있다.

#include <stdio.h>
#include <stdlib.h>

int main(void){
	int *a = malloc(sizeof(int));
    printf("%d\n",a);
    a = malloc(sizeof(int));
    printf("%d\n",a);
    system("pause");
    return 0;
}


int *a = malloc(sizeof(int));는 int가 4byte를 의미하므로 4byte만큼의 공간을 남겨둔다는 것이다. 그리고 거기에 성공을 하여서 a의 값이 메모리의 주소값이 된 것이다.

할때마다 주소게 출력이 된다.

동적으로 할당된 변수는 '힙'영역에 저장된다.

14-2 free()함수

C언어에서는 스택에 선언된 변수는 따로 메모리 해제를 해주지 않아도 된다. 그러나 동적으로 할당된 변수는 반드시 free()함수로 메모리 해제를 해주어야 한다. 작은 프로그램이라면 상관이 없지만 크기가 커질수록 메모리 해제를 하지 않으면 메모리내의 프로세스 무게가 무거워져 언젠가는 오류가 발생하기 때문이다. 그렇기때문에 메모리 누수를 방지해야 한다.

free()함수는 메모리를 해제시켜준다.

예제

#include <stdio.h>
#include <stdlib.h>

int main(void){
	int *a = malloc(sizeof(int));
    printf("%d\n",a);
    free(a);
    a = malloc(sizeof(int));
    printf("%d\n",a);
    free(a);
    system("pause");
    return 0;
}


여기서 free()함수로 메모리를 풀어주었기때문에 대부분은 첫번째 값과 두번째 값은 같은 값을 반환한다.

14-3.memset()

memset(포인터, 값,크기);
일괄적인 범위의 메모리를 특정한 값으로 설정하는 함수

1byte씩 값을 저장하므로 문자열 배열처리방식과 흡사하다. <string.h> 라이브러리에 선언이 되어있다. 동적으로 문자열을 처리하는 함수이다. 특정 범위의 메모리를 가득 채울 수 있다. 반복문보다 더 빠르게 작동한다.

예제

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
	char *a = malloc(100);
    memset(a,'A',100);
    for(int i=0; i<100;i++){
    	printf("%c ", a[i]);
    }
    system("pause");
    return 0;
}


memset(a,'A',100)은 a의 범위의 메모리에 'A'라는 문자를 100만큼 채워넣는 역할을 함을 알 수 있다.

#include <stdio.h>
#include <stdlib.h>

int main(void){
	int** p = (int**)malloc(sizeof(int*)*3);
    for(int i=0; i<3;i++){
    *(p+i) = (int*)malloc(sizeof(int)*3);
 	}
    
    for(int i=0; i<3; i++){
    	for(int j=0; j<3;j++){
        	*(*(p+i)+j)=i*3 + j;
        }
    }
    for (int i=0; i<3; i++){
    	for(int j=0; j<3; j++){
        	printf("%d",*(*(p+i)+j));
        }
        printf("\n")'
    }
    system("pause");
    return 0;
}

이중 포인터 문제이다. 이중 배열이라고도 할 수 있다.
잘 안된다. 왜인지 내일 알아봐야겠다.

좋은 웹페이지 즐겨찾기