June is Combung

동적할당과 정적할당 본문

C/동적할당

동적할당과 정적할당

june__Park 2021. 3. 29. 16:58
#include <stdio.h>
#include <stdlib.h>  // malloc(), free() 
#include <string.h> // strcpy_s()

/*
	< 동적할당 vs 정적할당 >
	1. 정적할당 
	 -> 컴파일 시 결정되는 할당 
	 -> 개발자가 미리 계획한 할당 
	   ex) 변수/배열 선언 
	 -> 한 번 태어나면 그 자료형이나 개수가 변경되지 않는다.
	 -> 수명이 정해져있다.
		지역 : 선언된 {}가 종료되면
		전역 : 프로그램이 종료되면
		.... 
	 -> 단점 
		1. 고정된 할당이기 때문에 
			배열의 경우 그 크기가 변경될 수 없다. 
		2. 수명이 결정되어있기 때문에 
			더이상 필요하지 않은 변수/배열임에도 자동으로 해제될 때까지 할당을 유지 
				==> 비효율적인 메모리 사용
	
	2. 동적할당 
	 -> 런타임(실행) 중 결정되는 할당 
	 -> malloc() 통해 할당하고, free() 해제한다.
	 -> heap 영역에 할당된다.
	    => 주소를 통해서만 접근할 수 있다. (이름을 지어줄 수 없다.)
	 -> 프로그램이 종료되면 해제되지만, 
		원하는 시점에 free() 로 해제가 가능하다. 
		 (왠만하면 free()는 꼭 쓰자!)
*/
void ex01(){
	// 학생 수를 입력 받고, 
	// 그 수만큼 국어점수를 저장할 배열을 선언 
	int num;
	printf("학생 수 : ");
	scanf_s("%d", &num);

	int* kr = (int*)malloc(sizeof(int) * num);   // int kr[num];
	int i;
	for(i = 0; i < num; ++i){
		printf("%d번 학생의 국어점수 : ", i);
		scanf_s("%d", &kr[i]);
	}

	for(i = 0; i < num; ++i){
		printf("kr[%d] : %d \n", i, kr[i]);
	}
	free(kr);
}
typedef struct Person {
	char name[20];
	int age;
} PER;
void ex02(){

	// malloc() 
	// 포인터변수 = (자료형*)malloc(바이트수)
	//   : 바이트 수 만큼 할당한 후, 할당된 곳의 시작주소를 return 

	// free(주소)

	
	// double 형 메모리 동적할당하겠다
	double* pa = (double*)malloc(sizeof(double));

	// dounble형 3칸짜리 배열을 동적할당하겠다
	double* pb = (double*)malloc(sizeof(double) * 3);

	// PER 구조체 1개를 동적할당하겠다. 
	PER* pc = (PER*)malloc(sizeof(PER));

	*pa = 4.15;
	pb[0] = 10.0;
	pb[1] = 20.0;
	pb[2] = 30.0;
	
	strcpy_s(pc->name, sizeof(pc->name),"이푸린");  // pc->name = "이푸린"
	pc->age = 10;
	
	printf("%lf \n", *pa);
	printf("%lf %lf %lf \n", pb[0], pb[1], pb[2]);
	printf("%s, %d세 \n", pc->name, pc->age);

	free(pa);
	free(pb);
	free(pc);
}
int main(){
	ex02();
	return 0;
}

'C > 동적할당' 카테고리의 다른 글

학생  (0) 2021.03.29
노드 Full  (0) 2021.03.29
노드  (0) 2021.03.29
Comments